2015-10-02 15 views
16

Tôi đang gặp sự cố khi tìm hiểu lý do đầu ra khác nhau trong mỗi trường hợp cụ thể này. Trong Bộ luật mẫu một, có một chương trình khuyến mãi biến như tôi mong đợi và kết quả đó là > 6, nhưng trong Bộ luật mẫu b, kết quả là <= 6:Quảng cáo biến đổi trong C

/* **Code a** */ 
puts("Code a\n"); 
unsigned int a = 6; 
int b = -20; 
(a+b > 6) ? puts("> 6\n") : puts("<= 6\n"); 

/* **Code b** */ 
puts("Code b:\n"); 
uint8_t a1 = 6; 
int8_t b1 = -20; 
(a1+b1 > 6) ? puts("> 6\n") : puts("<= 6\n"); 

Output:

Code a 

> 6 

Code b: 

<= 6 
+0

Hãy xem xét: [Trong biểu thức C trong đó không có dấu int và ký tên int có mặt, loại nào sẽ được thăng cấp thành loại nào?] (Http://stackoverflow.com/questions/2280663/in-ac-expression -where-unsigned-int-and-signed-int-hiện-trong-loại-sẽ-) Tôi hy vọng rằng sẽ giúp bạn. – Missu

+0

Cung cấp hình ảnh cho đầu ra văn bản? Điều đó được tự động tải khi một số mở câu hỏi này? Bạn có một theo dõi đằng sau đó?) Xin vui lòng chỉ cần sử dụng cắt và dán trong trường hợp như vậy. –

+5

Một ví dụ tốt về một bài đăng cơ bản, nhưng cũng được hình thành: Tiêu đề rõ ràng, tuyên bố khó khăn rõ ràng, mã mẫu, đầu ra, đầu ra dự kiến, thẻ tốt. – chux

Trả lời

9

Trường hợp phổ biến chuyển đổi số học được thực hiện trên các toán hạng của phép cộng. Đối với các loại số nguyên, điều này bao gồm các chương trình khuyến mãi số nguyên nếu cần thiết và nếu hai toán hạng không có cùng loại, một chuyển đổi tiếp theo sẽ được thực hiện để đưa chúng vào một kiểu chung.

Trong trường hợp đầu tiên không có chương trình khuyến mãi nhưng các toán hạng int được chuyển thành unsigned intint không thể giữ tất cả các giá trị có thể của unsigned int.

Trong trường hợp thứ hai, cả hai toán hạng được thăng cấp thành int và giữ nguyên là int vì chúng có loại chung.

Để tham khảo dự thảo tiêu chuẩn C11 trong phần 6.5.6khai thác Additive nói:

Nếu cả hai toán hạng có kiểu số học, chuyển đổi số học thông thường được thực hiện trên họ.

phần 6.3.1.8 chuyển đổi số học thông thường nói:

Nhiều nhà khai thác mà mong đợi toán hạng số học loại nguyên nhân chuyển đổi và các loại kết quả năng suất theo cách tương tự. Mục đích là để xác định loại thực phổ biến cho các toán hạng và kết quả là. Đối với các toán hạng được chỉ định , mỗi toán hạng được chuyển đổi, mà không thay đổi loại tên miền, thành loại có loại thực tương ứng là loại thực phổ biến. Trừ khi có quy định rõ ràng khác, loại thực phổ biến cũng là loại thực tế tương ứng của kết quả, có loại miền là tên miền loại của toán hạng nếu chúng giống nhau và phức tạp nếu không. Mẫu này được gọi là chuyển đổi số học thông thường

[...]

Nếu không, quảng cáo nguyên được thực hiện trên cả hai toán hạng. Sau đó, quy tắc sau đây được áp dụng cho các toán hạng bạt

[...]

  • Ngược lại, nếu các toán hạng có kiểu dữ liệu integer unsigned có xếp hạng cao hơn hoặc tương đương với cấp bậc của các loại của toán hạng khác, sau đó toán hạng với loại số nguyên đã ký được chuyển đổi thành loại toán hạng với chưa ký loại số nguyên

[...]

Một tham chiếu tốt cho lý do cho điều này có thể được tìm thấy trong câu hỏi: Why must a short be converted to an int before arithmetic operations in C and C++?.

+0

Bây giờ nó có ý nghĩa hoàn hảo. Cảm ơn – Lal0ver

+0

Cả hai "khuyến mại số nguyên" và các chuyển đổi cần thiết để mang các toán hạng đến một loại phổ biến là một phần của "chuyển đổi số học thông thường". Xem [N1570] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf) 6.3.1.8. –

+0

@KeithThompson hmmm, tôi không có ý định nói cách khác nhưng tôi có thể thấy nó đọc như thế nào. –

Các vấn đề liên quan