[英]Type casting a 16 bit unsigned integer to an 8 bit unsigned integer pointer in C
在玩指针时,我发现了一些有趣的东西。
我将一个 16 位 unsigned int 变量初始化为数字 32771,然后将该变量的地址分配给一个 8 位 unsigned int 指针。
现在 32771,以无符号的 16 位形式,具有 110000000000001 的二进制表示。所以当第一次取消引用 8 位指针时,我希望它打印 11000000 的值,即 = 192 并且在递增指针然后取消引用指针之后同样,预计它会打印值 00000001,即 128。
实际上,对于第一次解引用,打印了 3,如果我从左到右读取 11000000 并且第二次解引用打印 128,我会得到这个结果。
int main(){
__uint16_t a = 32771;
__uint8_t *p = (__uint8_t *)&a;
printf("%d", *p); //Expected 192 but actual output 3.
++p;
printf("%d", *p); //Expected 1, but actual output 128
}
我知道位是从右到左读取的,但是在这种情况下,位是从左到右读取的。 为什么?
32771 是 32768 加 3。在二进制中,它是 1000000000000011。
如果将其拆分为最高有效字节和最后有效字节,则会得到 128 和 3,因为 128 * 256 + 3 = 32771。
所以字节将是 3 和 128。没有特别的原因一个应该出现在另一个之前。 您的 CPU 可以按任意顺序存储组成多字节数字的字节。 显然,您将最低有效字节存储在比最高有效字节低的地址。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.