将Int转换为无符号字符

时间:2014-04-01 05:08:52

标签: c

我正在尝试读取C中int的单个字节,但由于某种原因会发生以下情况:

int x = -128;
//this prints 128 255
printf("%d %d\n", ((unsigned char *) (&x))[0], ((unsigned char *) (&x))[3]);

不应该打印128 128而不是吗?

3 个答案:

答案 0 :(得分:2)

它是特定于机器的,取决于处理器的endianness

(查看endianness wikipage,它解释得非常好; x86-64是小端的。)

答案 1 :(得分:2)

-128在两个补码中的表示是

11111111 11111111 11111111 10000000 // 4 bytes

系统的endianness表示字节存储在内存中的顺序。 Big-endian表示最高有效字节,即第一个字节,存储在最小地址中,而小端表示最低有效字节,即最后一个字节存储在最小地址中。你的机器是小端。因此,字节的顺序是

10000000 11111111 11111111 11111111 // 4 bytes

因此,((unsigned char *) (&x))[0]表示第一个字节100000000,并计算为128((unsigned char *) (&x))[3]表示评估为11111111的最后一个字节255

答案 2 :(得分:0)

Should it not print 128 128 instead? 

-128表示为

11111111 11111111 11111111 10000000
   [3]     [2]      [1]      [0]

当你在小端机器上说((unsigned char *) (&x))[0]时,它会打印出来 128你试图将(10000000)投射到unsigned char这是128而(unsigned char *) (&x))[3]会打印255,这是1的全部。