所以我使用以下代码将整数放入char []或unsigned char []
(unsigned???) char test[12];
test[0] = (i >> 24) & 0xFF;
test[1] = (i >> 16) & 0xFF;
test[2] = (i >> 8) & 0xFF;
test[3] = (i >> 0) & 0xFF;
int j = test[3] + (test[2] << 8) + (test[1] << 16) + (test[0] << 24);
printf("Its value is...... %d", j);
当我使用unsigned char类型和值1000000000时,它会正确打印。
当我使用char类型(相同的值)时,我打印98315724?
所以,问题真的是任何人都可以解释到底是怎么回事吗?
在检查两个不同数字的二进制文件时,我仍然无法解决最新情况。我认为签名是在MSB设置为1时表示负值(但是负值??)
我明确告诉缓冲区要插入什么内容,以及如何解释内容,所以不明白为什么会发生这种情况。
为了清楚起见,我在下面添加了二进制/十六进制。
11 1010 1001 1001 1100 1010 0000 0000 //二进制983157248
11 1011 1001 1010 1100 1010 0000 0000 //二进制为1000000000
3 A 9 9 C A 0 0 // 983157248的十六进制
3 B 9 A C A 0 0 //十六进制为1000000000
答案 0 :(得分:0)
当您说i & 0xFF
等时,您正在[0, 256)
范围内创建值。但是(你的)char
的范围为[-128, +128)
,因此你无法合理地存储这些值(即行为是实现定义的,而且很难理解)。
使用unsigned char
表示无符号值。线索就在名称中。
答案 1 :(得分:0)
除了Kerrek SB的答案外,请考虑以下事项:
计算机(几乎总是)使用名为twos-complement notation的内容来表示负数,高位用作“负”指示符。问问自己,当您在签名类型上执行轮班时会发生什么,考虑到计算机将专门处理已签名的位。
您可能需要在StackOverflow上阅读Why does left shift operation invoke Undefined Behaviour when the left side operand has negative value?以获取提示。
答案 2 :(得分:0)
这一切与internal representation
和每个type
使用data
来解释它的方式有关。在internal representation
的{{1}}中,字节的第一位保留符号,其他保留值。当第一位为1时,数字为负,随后的位代表正值的signed character
。例如:
complement