2013-03-06 22 views
6

này in đang B2xúc tiến Integer - các bước

short a=-5; 
unsigned short b=-5u; 
if(a==b) 
    printf("A1"); 
else 
    printf("B2"); 

Tôi đọc về xúc tiến integer nhưng nó vẫn còn chưa rõ ràng với tôi, làm thế nào nó hoạt động trong ví dụ ở đây là gì? Ai đó có thể đăng kỹ lưỡng các bước trình biên dịch theo sau trong việc mở rộng/cắt bớt các giá trị?

+0

trình biên dịch nào bạn đang sử dụng? –

+0

[this] (http://en.cppreference.com/w/cpp/language/implicit_cast) có thể hữu ích. – juanchopanza

+0

Việc thăng hạng số nguyên chỉ xảy ra trong biểu thức 'a == b' ở đó - là tất cả những gì bạn đang hỏi? –

Trả lời

8

Hãy xem qua mã của bạn:

short a = -5; 

a = -5, mà phù hợp với một đoạn ngắn. Cho đến nay rất dễ dàng.

unsigned short b = -5u; 

-5u nghĩa là áp dụng toán tử đơn nhất - cho hằng số 5u. 5u là (unsigned int) 5, và unary - không có quảng cáo, vì vậy bạn kết thúc với 4294967291 là 2^32-5. (Cập nhật: Tôi đã sai một chút trong câu trả lời ban đầu của tôi; xem một kịch bản thử nghiệm cho thấy phiên bản này là chính xác tại đây http://codepad.org/hjooaQFW)

Bây giờ khi đặt nó vào b, nó được cắt ngắn thành một dấu ngắn (2 byte, thường) , vì vậy b = 65531, là 2^16-5.

if(a == b) 

Trong dòng này, a và b đều được quảng bá để ints để so sánh có thể xảy ra chính xác. Nếu chúng được quảng bá cho quần short, b sẽ có khả năng quấn quanh. Nếu chúng được quảng cáo cho quần short không dấu, một khả năng sẽ quấn quanh.

Vì vậy, nó giống như nói if((int) a == (int) b). Và a = -5, do đó (int) a = -5, và b = 65531, vì vậy (int) b = 65531, bởi vì ints lớn hơn quần short.

+0

Tôi sẽ không nói '-5u' không có ý nghĩa - nó được xác định rõ bởi tiêu chuẩn. –

+3

Um, '-5u' là hoàn toàn hợp lý. Nó áp dụng '-' cho hằng số nguyên' 5u'. –

+0

Bạn nhấn một điểm tôi quan tâm: vì vậy TRƯỚC -5 được lưu trữ trong biến 'a' ngắn ... giá trị hằng số của nó được coi là số nguyên, phải không? Tôi rất quan tâm đến điểm này –

3
a == b 

ab đều thăng int trong biểu thức trên.

unsigned short b=-5u; 

Trong tuyên bố này -5U được chuyển thành unsigned short bởi các phương tiện chuyển đổi số nguyên (C99, 6.3.1.3p2 áp dụng ở đây) và trở thành một giá trị lớn.

(C99, 6.3.1.3p2) "Nếu không, nếu loại mới chưa được ký, giá trị được chuyển đổi bằng cách liên tục thêm hoặc trừ nhiều hơn giá trị lớn nhất có thể được thể hiện trong loại mới cho đến khi giá trị nằm trong phạm vi của loại mới. "

b giá trị sau đó (unsigned short) ((unsigned int) USHRT_MAX + 1 -5) đó là (unsigned short) 65531 nếu USHRT_MAX(unsigned short) 65535.

Vì vậy, những gì bạn có là:

(short) -5 == (unsigned short) 65531

tương đương sau khi khuyến mãi nguyên của cả hai toán hạng để:

-5 == 65531

tương đương với 0.

+0

lại "Trên hệ thống bổ sung của hai", đó là cách thức bất kể biểu diễn số nguyên đã ký, vì tiêu chuẩn thánh yêu cầu nó là nhị phân, và vì 5 nhỏ hơn rất nhiều so với phạm vi yêu cầu tối thiểu, và vì tiêu chuẩn yêu cầu số học chưa ký là modulo 2^n trong đó n là số bit đại diện. Vì vậy, cho, nói, 32-bit 'unsigned' và 16-bit' unsigned short' biểu thức '-5u' trong chính nó mang lại giá trị 2^32-5, và sau đó giá trị modulo 2^16 nhất thiết là 2^16- 5. một lần nữa, bất kể biểu diễn số nguyên đã ký. –

+0

@ Cheersandhth.-Alf Đồng ý, tôi đã xóa câu này ngay trước bình luận của bạn. Tôi bắt đầu với * trên hệ thống bổ sung của hai * bởi vì ban đầu tôi muốn thêm thông tin về sự thay đổi biểu diễn (không). – ouah

0

short-unsigned short là một chuyển đổi (do đó có rank chuyển đổi)

short để int là một chương trình khuyến mãi (do đó có thứ hạng khuyến mãi)

chương trình khuyến mãi được ưa thích hơn chuyển đổi vì bảng xếp hạng. Chương trình khuyến mãi diễn ra trong các phép tính số học và các hoạt động khác. Chuyển đổi xảy ra khi chỉ lưu trữ một loại tích phân bên trong một loại khác. Các phép tính số học có thể gây ra các chuyển đổi cũng như các chương trình khuyến mãi để kết hợp các loại với nhau. Ví dụ khác:

unsigned int u = 2; 
int i = 2; 
u + i; 

i được chuyển đổi (không được thăng cấp) thành unsigned.

Giá trị của bạn được chuyển đổi thành giá trị lớn hơn vì giá trị này bao quanh xung quanh là unsigned. Sau đó, họ được thăng cấp thành int. Do đó, a != b vì điều này.