繁体   English   中英

在 C 中将 16 位无符号 integer 类型转换为 8 位无符号 integer 指针

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM