2013-06-13 131 views
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 
} 
+0

相关:http://stackoverflow.com/a/7459943/24913 –

+0

请注意严格地说这是未定义的行为。在你的cout声明中,你是从一个工会成员那里读到的,这个工会成员并不是最近写给他的成员。 –

回答

5

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

你可能使用与x86架构:),这是小端处理器。

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

编辑

对不起,相同的,但以相反的顺序,则初始化“ABC”多字符的文本,这从处理器寄存器变为相反的顺序存储和作为字符数组整数它变成“CBA “

14

您使用的是多字符文字'ABC'来初始化int

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

'ABC'中没有便携式(即独立于实现)的方式来预测该程序将按照字符的顺序执行的操作。

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

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

+1

我可以建议多字符文字是“不寻常的”而不是非标准的。毕竟,你引用了描述它们的标准部分...... –

+0

@KazDragon非常真实。编辑。 – jogojapan

+2

@jogojapan:+1从来不知道这种字面类型,谢谢:) – legends2k

相关问题