Tôi đã đọc trong tiêu chuẩn C99 về các chuyển đổi số học thông thường.C chuyển đổi số học thông thường
Nếu cả hai toán hạng đều có cùng loại, thì không cần chuyển đổi thêm nữa là .
Nếu không, nếu cả hai toán hạng đã ký các kiểu nguyên hoặc cả hai đều có loại unsigned integer, các toán hạng với loại ít nguyên rank chuyển đổi được chuyển đổi sang kiểu của toán hạng với hơn xếp hạng.
Ngược lại, nếu các toán hạng có kiểu dữ liệu integer unsigned có rank lớn hơn hoặc bằng cấp bậc của các loại toán hạng khác, sau đó các toán hạng với kiểu số nguyên ký được chuyển đổi sang các loại của toán hạng với loại số nguyên không dấu.
Ngược lại, nếu kiểu của toán hạng với kiểu số nguyên ký thể đại diện cho tất cả các giá trị của các loại toán hạng với unsigned loại số nguyên, sau đó các toán hạng với kiểu dữ liệu integer unsigned được chuyển để loại toán hạng với kiểu số nguyên đã ký.
Nếu không, cả hai toán hạng sẽ được chuyển thành loại số nguyên không dấu tương ứng với loại toán hạng có loại số nguyên đã ký.
Vì vậy, chúng ta hãy nói rằng tôi có đoạn mã sau:
#include <stdio.h>
int main()
{
unsigned int a = 10;
signed int b = -5;
printf("%d\n", a + b); /* 5 */
printf("%u\n", a + b); /* 5 */
return 0;
}
Tôi nghĩ đoạn in đậm áp dụng (từ unsigned int
và signed int
có cùng ngạch Tại sao không b chuyển đổi sang unsigned
Hoặc có lẽ nó.? được chuyển thành unsigned nhưng có cái gì đó tôi không hiểu?
Cảm ơn bạn đã dành thời gian :-)
Điều gì khiến bạn nghĩ rằng 'b' không được chuyển thành 'unsigned'? –
@Charles Bailey Tôi đoán tôi đã ngu ngốc mong đợi kết quả khác nhau cho printfs: -? – user963368
+5 là +5, bất kể int được ký hay chưa ký. –