【问题标题】:what does 48 and 55 mean in hex? I found a code that converts from decimal to hex that I posted down below十六进制中的 48 和 55 是什么意思?我找到了一个从十进制转换为十六进制的代码,我在下面发布了
【发布时间】:2021-11-11 17:23:57
【问题描述】:
 // check if temp < 10
        if (temp < 10) {
            hexaDeciNum[i] = temp + 48;
            i++;
        }
        else {
            hexaDeciNum[i] = temp + 55;
            i++;
        }
 
        n = n / 16;
    }

我发现这段代码可以从十进制转换为十六进制,但正如您所见,我们有 + 48 和 + 55 有人知道我们为什么使用这些数字吗?顺便说一句 temp 是存储剩余部分...谢谢!

【问题讨论】:

  • 那些被称为“幻数”。不要写这样的代码。

标签: c++ hex


【解决方案1】:

代码正在做的,糟糕的是,将 0 到 15 范围内的值转换为该值的十六进制表示的对应字符。正确的方法是使用查找表:

const char hex[] = "0123456789ABCDEF";

hexaDeciNum[i] = hex[temp];

所写代码的一个问题是,它假设(但未说明)您希望输出字符以 ASCII 编码。几乎总是如此,但没有必要做出这样的假设。编译器知道它所针对的系统使用什么编码,因此我的代码中的数组hex 中的值对于目标系统来说是正确的,即使它不使用 ASCII。

编写代码的另一个问题是幻数。他们不会告诉你他们的目的是什么。要摆脱魔术数字,请将48 替换为'0',并将55 替换为'A' - 10。但请参阅上一段。

在 C 和 C++ 中,您可以通过将基数为 10 的数字添加到 '0' 来将其转换为相应的字符,所以

hexaDeciNum[i] = digit + '0';

将正常工作。任何其他值都没有这样的要求,因此不能保证转换为字母,即使您使用'A' 而不是硬编码的65

不要让我开始使用毫无意义的 cmets:

// check if temp < 10
    if (temp < 10) 

【讨论】:

  • 你打错了,应该是“将55替换为65-10,然后将65替换为'A'”最终导致众所周知的'A' + (digit - 10)(不是通用可移植性,它确实要求 AF 具有连续的数值)
  • @BenVoigt -- 很好。 55 不是拼写错误,只是一个更晦涩的幻数。
【解决方案2】:

如果您查看 ASCII 表,您会看到数字 0..9 的字符移动了 48。因此,如果您取一个数字,例如0 加上 48,你会得到一个数字“0”的字符。

字符也是如此,如果你取数字 10 并加上 55,你会从 ASCII 表中得到一个“A”字符。

【讨论】:

    猜你喜欢
    • 2019-01-01
    • 1970-01-01
    • 2011-12-09
    • 2014-12-31
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 2018-09-04
    相关资源
    最近更新 更多