铸造类型是否依赖于大/小端?

cod*_*out 9 c casting endianness

考虑一下这段代码:

int a=0x10000001;
char b;

b=(char)a;
printf("%#x \n",b);
Run Code Online (Sandbox Code Playgroud)

在我的电脑上,它打印0x01,我并不感到惊讶.它如何在BIG ENDIAN机器上运行?我希望它会打印出来0x10000001.我对吗?

我浏览了书籍和网页,但我没有找到关于铸造操作如何真正处理内存的明确信息.

Jur*_*aho 15

不,如果可能的话,像所讨论的那样投射会保留价值,并且不依赖于记忆表示.

如果要重新解释内存表示,则需要转换指针.然后它将取决于字节顺序:

b=*((char*)&a);
Run Code Online (Sandbox Code Playgroud)


R. *_*des 8

数字不是大端或小端.字节序列是大端或小端.数字只是数字.

不出所料,C的数字类型数字有关,而不是字节序列.


Tho*_*thy 2

不。在此示例中,字节序并不重要。转换为 char(假设 char 比 int 窄)将保留低位,并且低位就是低位,无论它们如何存储在内存中。