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

时间:2013-11-27 10:51:36

标签: c casting endianness

考虑一下这段代码:

int a=0x10000001;
char b;

b=(char)a;
printf("%#x \n",b);

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

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

4 个答案:

答案 0 :(得分:15)

不,像所讨论的那样进行投射会尽可能保留值,并且不依赖于内存表示。

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

b=*((char*)&a);

答案 1 :(得分:8)

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

C的数字类型使用数字处理,而不是字节序列

答案 2 :(得分:2)

没有。在这个例子中,字节顺序无关紧要。转换为char(假设char比int窄)将保留低位,低位为低位,无论它们如何存储在内存中。

答案 3 :(得分:0)

C ++标准声明如下:

  

5.2.3.1简单类型说明符(7.1.5)后跟带括号的表达式列表构造给定类型的指定类型的值   表达清单。

所以是的,无论二进制表示如何,它都会构造新的实例,将较宽的类型降级为较短的类型。因此,如果您对要传递给char的int的确切部分感兴趣,请使用按位移位运算符 - 它与平台无关并产生可预测的结果。