很多人都知道以下示例来确定系统是小端还是大端:
#include <stdio.h>
int main()
{
unsigned int i = 1;
char *c = (char*)&i;
if (*c)
printf("Little endian");
else
printf("Big endian");
getchar();
return 0;
}
但是,我想知道以下代码是否仍然有效且功能正常:
#include <stdio.h>
int main()
{
unsigned int i = 1;
char *c = &i;
if (*c)
printf("Little endian");
else
printf("Big endian");
getchar();
return 0;
}
这基本上是关于如何解释大端系统上的地址运算符&的问题 .
假设你不进行上面的类型转换,并假设一个大端系统返回最高位地址(基本上是int开始的地方),那么这段代码仍会打印“Little endian”,尽管你真的在处理一个大端系统 .
对此的任何评论都会非常有帮助 . 提前谢谢你:D .
2 回答
第二个示例将为您提供一个编译器警告,指出在没有强制转换的情况下赋值无效 . 如果忽略该警告,则可能会在尝试未定义的行为时始终获得相同的结果 .
赋值
char *c = &i;
违反了C 2018 6.5.16.1中的约束.1 . 该段落中的“下列其中一个应该成立”,并且选项列表中最接近的匹配是:char *
和int *
不兼容,因此赋值不符合约束 .也就是说,如果编译器确实接受了这个语句(它可能,因为C标准允许扩展)并将右侧的指针转换为左侧的类型(作为赋值应该),结果应该是指向最低的指针解决了对象的字节,无论字节顺序如何 . 对于每个C 2018 6.3.2.3 7的指针转换,这是正常的: