2013-06-13 9 views
6

Sản lượng dự kiến ​​của tôi cho u6.c là ABC nhưng ở đây tôi có CBA tại sao lại như vậy? Bạn có thể làm sáng tỏ điều này với lời giải thích chi tiết?Tại sao in chuỗi ngược lại?

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

Lưu ý rằng nghiêm chỉnh nói rằng đây là hành vi không xác định. Trong tuyên bố cout của bạn, bạn đang đọc từ một thành viên công đoàn không phải là thành viên được viết gần đây nhất. –

Trả lời

5

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

Bạn có thể sử dụng bộ vi xử lý với kiến ​​trúc x86 :), mà là về cuối nhỏ.

Điều này có nghĩa là khi bạn gán ký tự cho mảng char, chúng đi vào bộ nhớ theo cùng thứ tự, nhưng khi bạn đọc bộ nhớ đó dưới dạng số nguyên, nó sẽ được đăng ký bộ xử lý theo thứ tự ngược lại.

Sửa

Xin lỗi, tương tự nhưng theo thứ tự ngược lại, bạn khởi tạo số nguyên với 'ABC' đa ký tự chữ, mà đi từ thanh ghi vào bộ nhớ theo thứ tự ngược và mảng như char nó trở thành "CBA "

14

Bạn đang sử dụng ký tự nhiều chữ 'ABC' để khởi tạo int.

Cách chữ nhiều ký tự (cách không phổ biến khi sử dụng '') được hiểu là được xác định thực hiện. Cụ thể, thứ tự của các ký tự riêng lẻ trong cách diễn giải int được xác định thực hiện.

Không có cách nào di động (ví dụ: không độc lập) để dự đoán chương trình này sẽ thực hiện theo thứ tự của các ký tự trong 'ABC'.

Từ Standard (C++ 11, §2.14.3/1):

[...] Một literal multicharacter có kiểu int và giá trị thực hiện xác định.

+1

Tôi có thể đề nghị rằng các ký tự nhiều ký tự là "không bình thường" thay vì không chuẩn. Sau khi tất cả, bạn trích dẫn một phần của tiêu chuẩn mô tả chúng ... –

+0

@ KazDragon Rất đúng. Đã chỉnh sửa. – jogojapan

+2

@jogojapan: +1 chưa bao giờ biết về loại chữ này, cảm ơn :) – legends2k