2013-06-13 11 views
6

Moje oczekiwane wyniki dla u6.c to ABC, ale tutaj dostałem CBA, dlaczego tak jest? Czy możesz rzucić trochę światła na to ze szczegółowym wyjaśnieniem?Dlaczego drukuje odwrotny ciąg znaków?

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

Powiązane: http://stackoverflow.com/a/7459943/24913 –

+0

Należy zauważyć, że ściśle mówiąc jest to niezdefiniowane zachowanie. W twoim oświadczeniu cout czytałeś od członka związku, który nie był tym, do którego ostatnio napisałeś. –

Odpowiedz

5

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

Prawdopodobnie wykorzystywać procesor o architekturze x86 :), który jest little-endian.

Oznacza to, że po przypisaniu znaku do tablicy char przechodzą do pamięci w tej samej kolejności, ale kiedy odczytujesz tę pamięć jako liczbę całkowitą, przechodzi ona do rejestru procesorów w odwrotnej kolejności.

Zmieniano

Niestety, takie same, ale w odwrotnej kolejności, należy zainicjować całkowitą o „abc” wieloznakowych dosłownym, który jedzie z rejestru procesora do pamięci w odwrotnej kolejności i jako char tablicy staje się „CBA "

14

Używasz wieloznakowy dosłownego 'ABC' aby zainicjować int.

Sposób interpretacji literału wieloznakowego (który jest rzadkim sposobem używania '') jest zdefiniowany przez implementację. Konkretnie, kolejność poszczególnych znaków w interpretacji int jest zdefiniowana przez implementację.

Nie ma przenośnego (tj. Niezależnego od wdrożenia) sposobu przewidywania, co ten program zrobi w zakresie kolejności znaków w 'ABC'.

od standardu (C++ 11 §2.14.3/1):

[...] A multicharacter dosłownym jest typu int i wartość implementacji zdefiniowane.

+1

Mogę zasugerować, że literały wieloznakowe są raczej "niezwykłe" niż niestandardowe. Wszak cytujesz część normy, która je opisuje ... –

+0

@KazDragon Bardzo prawdziwe. Edytowane. – jogojapan

+2

@jogojapan: +1 nigdy nie wiedziałem o tym dosłownym typie, dzięki :) – legends2k

Powiązane problemy