11

以下程序测试英特尔处理器上的小/大端。实际上小端是正确的输出。首先,我在没有初始化的情况下投射intchar*访问它的值int *。我不理解输出的第二部分。这里int指针被强制转换为char *. 那么为什么int指针没有改变它的对齐方式char *呢?

00000000 00000000 00000011 01111111 = 895
0        0         3       127

int main() {
    int num = 895;
    if(*(char *)&num == 127)
    {
        printf("\nLittle-Endian\n");
    }
    else
    {
        printf("Big-Endian\n");
    }

    int *p = (char *)&num ;
    if(*p == 127)
    {
        printf("\nLittle-Endian\n");
    }
    else
    {
        printf("Big-Endian\n");
    }
    printf("%d\n",*p);
}

o/p

Little-Endian
Big-Endian
895
4

2 回答 2

6
  1. 使用此比较的程序的前半部分:

    if(*(char *)&num == 127)
    

    看起来不错。

  2. 您的程序的后半部分包含以下作业:

    int *p = (char *)&num ;
    

    这不是有效的代码。如果没有显式强制转换,您将无法转换指针类型。在这种情况下,您的编译器可能会让您侥幸逃脱,但严格来说,这是不正确的。此行应为:

    int *p = (int *)(char *)#
    

    或者只是这个等价的声明:

    int *p = #
    

    从这个例子中,我相信你可以明白为什么你的第二个测试没有按照你想要的方式工作——你仍然在整体上运行int,而不是在你感兴趣的单个字节上。如果你做了pa char *,它将按您预期的方式工作:

    char *p = (char *)#
    
于 2013-01-26T19:57:04.773 回答
2

可以将 int 指针强制转换为char *吗?

是的,只有反向才会调用未定义的行为,更准确地说,使用从char *to 转换的结果int *(因为char是 1 字节对齐的,所以任何数据指针类型都可以安全地转换为char *)。

于 2013-01-26T19:55:42.283 回答