以下程序测试英特尔处理器上的Little / Big endian。实际上小端是正确的输出。首先,我将int
转换为char*
,并在未初始化为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
答案 0 :(得分:6)
使用此比较的程序的前半部分:
if(*(char *)&num == 127)
看起来很好。
程序的后半部分包含以下任务:
int *p = (char *)&num ;
哪个不是有效代码。没有显式强制转换,您无法转换指针类型。在这种情况下,您的编译器可能会让您逃脱它,但严格来说,它是不正确的。这一行应为:
int *p = (int *)(char *)#
或仅仅是这个等价陈述:
int *p = #
从这个例子中,我确定你可以看到为什么你的第二次测试不能按照你喜欢的方式工作 - 你仍然在整个int
上运行,而不是在单个字节上运行您感兴趣的是。如果您将p
设为char *
,它会按您预期的方式运作:
char *p = (char *)#
答案 1 :(得分:1)
可以将int指针强制转换为
char *
吗?
是的,它只是调用未定义行为的反转,更准确地说,是使用从char *
到int *
的强制转换结果(因为char
是1字节对齐的,所以任何数据指针类型都可以安全地转换为char *
)。