【发布时间】:2013-06-06 18:01:06
【问题描述】:
所以我使用以下代码将整数放入 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 表示负值(但负字符?wth?)
我明确告诉缓冲区要插入什么,以及如何解释内容,所以不明白为什么会发生这种情况。
为了清楚我检查的内容,我在下面包含了二进制/十六进制。
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
【问题讨论】:
-
C 并没有真正的“字符”;它只有小整数。
char只是最小整数类型的名称,最小范围为[-127, 127](如果有符号)或[0, 255](如果无符号),并且(不幸的是)它是否有符号是实现定义的。对于此用例,您必须使用unsigned char。 -
另外,为避免在将某些内容移入
int的符号位时触发未定义的行为,您需要在uint32_t中进行重组,然后再转换为int。
标签: c++ arrays integer char unsigned