考虑一下这段代码:
int a=0x10000001;
char b;
b=(char)a;
printf("%#x \n",b);
在我的电脑上打印出0x01,我并不感到惊讶。
它如何在BIG ENDIAN机器上运行?我希望它会打印0x10000001
。我对吗?
我浏览了书籍和网页,但我没有找到关于转换操作如何真正处理内存的明确信息。
答案 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的确切部分感兴趣,请使用按位移位运算符 - 它与平台无关并产生可预测的结果。