2013-06-13 19 views
6

U6.c için beklenen çıktımız ABC'ydi ama burada CBA var neden bu kadar? Detaylı bir açıklamayla biraz ışık tutabilir misiniz?Neden ters dizesi yazdırılıyor?

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

Related: http://stackoverflow.com/a/7459943/24913 –

+0

Kesinlikle bu konuşma undefined davranış olduğunu unutmayın. Senin cout ifadesinde, en yakın zamanda yazılan bir sendika üyesinden okuyorsun. –

cevap

5

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

Muhtemelen küçük endian olan x86 mimarisine :) ile işlemci kullanın.

Bu, char dizisine karakter atadığınızda, aynı sırayla belleğe giderler, ancak bu belleği tamsayı olarak okuduğunuzda, işlemci kaydına ters sırada gider.

düzenlenmiştir, aynı

yazık ki ancak ters sırada, bu "CBA olur ters hafıza ve benzeri gibi bir karakter dizisine işlemci kayıt gider değişmez 'ABC' çoklu karakteri ile tamsayıyı başlatmak "

14

Bir int başlatılamadı değişmez bir çok karakteri 'ABC' kullanıyor.

Çok karakterli ('''u kullanmanın nadir bir yolu olan) sözdiziminin nasıl yorumlandığı tanımlanır. Spesifik olarak, int yorumunda bireysel karakterlerin sırası, uygulama tanımlıdır. Bu programın, 'ABC''daki karakterlerin sırasına göre ne yapacağını tahmin etmek için taşınabilir (yani, uygulamadan bağımsız) bir yolu yoktur.

[...], bir çok hazır int tip ve uygulama tanımlı değer vardır: Standardı (C++ 11, §2.14.3/1) kaynaktan

.

+1

Çok karakterli edebi türlerin standart olmayandan çok "sıradışı" olduklarını önerebilir miyim? Sonuçta, bunları tarif eden standardın bir kısmını siz söyleyin ... –

+0

@KazDragon Çok doğru. Düzenlenen. – jogojapan

+2

@jogojapan: +1 bu literal tip hakkında hiçbir şey bilmiyordu, teşekkürler :) – legends2k