6

我对 u6.c 的预期输出是 ABC,但在这里我得到了 CBA,为什么会这样?您能否通过详细的解释对此有所了解?

union mediatech
{ 
 int i; 
 char c[5]; 
};

int main(){
 mediatech u1 = {2};               // 1
 mediatech u2 = {'a'};             // 2
 mediatech u3 = {2.0};             // 3
 mediatech u6 = {'ABC'};           // 6

 cout<<"\nu6.i = "<<u6.i<<" u6.c="<<u6.c;  // o/p: u6.i=4276803  u6.c=CBA
}
4

2 回答 2

14

您正在使用多字符文字'ABC'来初始化int.

如何解释多字符文字(这是一种不常见的使用方式'')是实现定义的。具体来说,解释中各个字符的顺序int是实现定义的。

没有可移植(即独立于实现)的方法来预测该程序将按照'ABC'.

来自标准(C++11,§2.14.3/1):

[...] 多字符文字具有类型int和实现定义的值。

于 2013-06-13T08:40:42.893 回答
5

http://en.wikipedia.org/wiki/Little_endian#Little-endian

您可能使用 x86 架构的处理器 :),它是 little-endian。

这意味着当您将字符分配给 char 数组时,它们会以相同的顺序进入内存,但是当您将该内存作为整数读取时,它会以相反的顺序进入处理器寄存器。

已编辑

抱歉,相同但顺序相反,您使用 'ABC' 多字符文字初始化整数,它以相反的顺序从处理器寄存器到内存,并且作为 char 数组,它变为“CBA”

于 2013-06-13T08:46:38.070 回答