c - char十六进制转义序列和十六进制数的区别

标签 c hex

<分区>

为什么 '\x90' 和 0x90 彼此不同。我知道一个是十六进制转义序列,另一个是十六进制数。但是,如果我将它们转换为十进制,我会得到 144 ,这应该是 '\x90' 和 0x90 的值。另外,书上说 '\x90' 是负值,而 0x90 是正值。

据我所知 char 只有 1 个字节而 int 是 4 ,所以我们会得到

char '\x90' = 1001 0000 ( 1 byte,8 bits)
int 0x90 = 1001 0000 0000 0000 0000 0000 0000 0000 (4 byte,32 bits)

我仍然不明白为什么 char x90 是负数并导致与 int 0x90 不同的值。

我的问题不是关于 char signed 和 unsigned ,虽然这与我的问题有关,但我问的是这些字符的 into 值..

最佳答案

char 是 1 个字节 = 8 位。如果我们认为它是“无符号的”(只有正数),那么 0x90 = 144,这是没有问题的。

但是char 不是unsigned。意味着保留一位以指示正或负(符号位)。因此只有 7 位用于表示最大正数。 2^7 = 128。当您尝试将 0x90 分配给 char 时,它因此大于最大的正值。这是有符号溢出和未定义行为。

大多数实现只会绕回负数,因此它变成 -128 - (128-144) = -128 + 16 = -112。

位可能相同,但解释不同。

(免责声明:7位实际能容纳的最大正值是127,我说我说的是因为它最直观。0是必须考虑的值之一,所以真正的公式是 2^N-1,其中 N 是位数。考虑 1 位;即使 2^1 = 2,最大值也是 1)

关于c - char十六进制转义序列和十六进制数的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49162370/

相关文章:

c# - 如何将这个十六进制字符串转换成长字符串?

python - 需要进行异或运算的十六进制字符串表示形式的列表

C++从十六进制字符串转换为int时出错

c - 符号常量是否经过预处理?

c - 从C中读取未知数量的int的txt文件

c++ - 如何编写返回 const char* 的函数,这是一个修改后的 const char* 参数?

分支定界问题的 C 代码

c - 线程产生相同的随机数?

c++ - 将 'B' 转换为 0xB

与所有其他来源不同的十六进制除法的 C 输出