指针强制转换问题(C)

wwodge7n  于 2023-01-12  发布在  其他
关注(0)|答案(1)|浏览(150)

也许你们中的一个可以帮助我。我不知道该怎么做了。我有以下测试代码:

#include <stdio.h>

int main() {

    unsigned int block = 0;
    unsigned int alp = 0;

    char *input ="test";

    unsigned int *pt = NULL;

    pt = (unsigned int*)input;

    alp |= ((*pt) >> 8);
    printf("pointer value:\t %d \n", alp);

    for(int a = 0; a < 3; a++) {
        block |= (unsigned char)input[a];
        if(a != 2) {
            block <<= 8;
        }
    }
    printf("block value:\t %d \n", block);

    return 0;
}

我希望这两个值完全相同,因为它们看起来正好是3个字节。只有值有区别。有人知道为什么会这样吗?或者可以解释一下为什么?
指针值:7631717块值:7628147
使用“gcc测试. c-墙壁-o测试”(gcc(Ubuntu 12.2.0- 3ubuntu 1)12.2.0)编译
多谢

lf5gs5x2

lf5gs5x21#

块的值为

(input[0] << 16) | (input[1] << 8) | (input[2]);

如果你使用的是little-endian系统(大多数人都是这样),那么alp的值是

(input[3] << 16) | (input[2] << 8) | (input[1]);

在little-endian系统中,不同的结果是意料之中的。你的CPU读取第一个字节作为最低有效位,最后一个字节作为最高有效位,但是你的for循环读取第一个字节作为最高有效位,最后一个字节作为最低有效位。
More info on endianness

相关问题