C ++将整数复制到char []或unsigned char []错误

时间:2013-06-06 18:01:07

标签: c++ arrays integer char unsigned

所以我使用以下代码将整数放入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

3 个答案:

答案 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