在 C 中将 16 位无符号整数类型转换为 8 位无符号整数指针
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 可以按任意顺序存储组成 multi-byte 数字的字节。显然,您将最低有效字节存储在比最高有效字节低的地址。
在研究指针时,我发现了一些有趣的东西。
我将一个 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 可以按任意顺序存储组成 multi-byte 数字的字节。显然,您将最低有效字节存储在比最高有效字节低的地址。