首页 文章

大端系统上的地址运算符

提问于
浏览
1

很多人都知道以下示例来确定系统是小端还是大端:

#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 回答

  • -1

    第二个示例将为您提供一个编译器警告,指出在没有强制转换的情况下赋值无效 . 如果忽略该警告,则可能会在尝试未定义的行为时始终获得相同的结果 .

  • 3

    赋值 char *c = &i; 违反了C 2018 6.5.16.1中的约束.1 . 该段落中的“下列其中一个应该成立”,并且选项列表中最接近的匹配是:

    • 左操作数具有原子,限定或非限定指针类型,并且(考虑左值操作数在左值转换后将具有的类型)两个操作数都是指向兼容类型的限定或非限定版本的指针,并且左边指向的类型具有右边指出的所有类型的限定词;

    char *int * 不兼容,因此赋值不符合约束 .

    也就是说,如果编译器确实接受了这个语句(它可能,因为C标准允许扩展)并将右侧的指针转换为左侧的类型(作为赋值应该),结果应该是指向最低的指针解决了对象的字节,无论字节顺序如何 . 对于每个C 2018 6.3.2.3 7的指针转换,这是正常的:

    ...当指向对象的指针转换为指向字符类型的指针时,结果指向对象的最低寻址字节 .

相关问题