Loại mặc định của hằng số nguyên được ký hoặc chưa ký? chẳng hạn như 0x80000000, làm cách nào tôi có thể quyết định sử dụng nó dưới dạng hằng số nguyên đã ký hoặc hằng số nguyên không dấu mà không có bất kỳ hậu tố nào?Kiểu mặc định của hằng số nguyên được ký hoặc chưa ký?
Nếu đó là hằng số nguyên đã ký, cách giải thích trường hợp sau?
printf("0x80000000>>3 : %x\n", 0x80000000>>3);
đầu ra:
0x80000000>>3 : 10000000
Các trường hợp dưới đây có thể cho thấy nền tảng của tôi sử dụng dịch chuyển bitwise số học, không lôgic Bitwise thay đổi:
int n = 0x80000000;
printf("n>>3: %x\n", n>>3);
đầu ra:
n>>3: f0000000
Thông thường, '0x80000000' là' INT_MAX + 1', vì vậy nó chưa được ký. Do đó thay đổi logic trong ví dụ đầu tiên. Nhưng khi bạn gán nó vào một 'int', bạn gọi hành vi không xác định, và thường kết quả là' INT_MIN'. Các số nguyên âm chuyển dịch trái được thực hiện, thường sử dụng phép dịch số học. Sự khác biệt là ở phần sau, bạn buộc nó vào một loại đã ký. –
@DanielFischer 'INT_MAX + 1' là UB nhưng' int n = 0x80000000; 'không phải là UB nhưng được thực hiện xác định và chuyển đổi số nguyên trong trường hợp này được cai trị bởi 6.3.1.3p3 (trong C99) – ouah
@ouah The' INT_MAX + 1' có nghĩa là biểu thức toán học, chứ không phải C.Tuy nhiên, chính xác là việc chuyển đổi thành 'int' không phải là hành vi không xác định, nhưng được xác định bằng thực thi. Lỗi của tôi. –