2011-09-24 74 views
10

Có mã:Thêm hai biến unsigned char và kết quả là int

#include <iostream> 
int main(){ 
    unsigned char a = 4, b = 255; 
    int g = (unsigned char)a + (unsigned char)b; 
    std::cout << g << std::endl; 
    return 0; 
} 

Kết quả:

259 

Tại sao kết quả là 259, không phải 3? Nếu có thêm hai biến char chưa được ký, phải có tràn, kết quả phải là 3 và sau đó nó sẽ chuyển đổi từ unsigned char 3 thành int 3.

Trả lời

14

Thao tác bổ sung trước tiên sẽ là promote. . Đây là cách C hoạt động. Nếu bạn muốn cắt ngắn, bạn cần phải gán nó trở lại thành loại hẹp hơn, chẳng hạn như unsigned char.

6

Số học số nguyên không bao giờ được thực hiện trên các loại dữ liệu nhỏ hơn int. Ví dụ: đối với các loại nhỏ hơn int ví dụ: nếu hai loại charshort int được thêm vào, chúng được thăng cấp thành int trước bất kỳ phép toán số học nào và kết quả là một loại số nguyên. Nếu một trong các loại đã xảy ra lớn hơn int, ví dụ: long long intint thì int được thăng cấp thành long long int và kết quả là long long int.

(§ 4,5/1) - Một rvalue kiểu char, ký char, unsigned char, ngắn int, hoặc unsigned ngắn int có thể được chuyển đổi sang một rvalue kiểu int nếu int có thể đại diện tất cả các giá trị của loại nguồn; nếu không, giá trị rvalue nguồn có thể là được chuyển đổi thành giá trị của loại không dấu int.

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