Tôi có nghi ngờ từ hai đoạn mã dưới đây.Lỗi dữ liệu khi so sánh các giá trị
Tôi đã chạy mã này trên máy 64 bit (x86_64-linux-gnu). Tôi có thể thấy giá trị Val
tràn khi loại dữ liệu là unsigned integer
.
#include<stdio.h>
main()
{
unsigned int Val = 0xFFFFFFFF-15, Val2 = 0xFFFFFFFF;
if (Val+16 < Val2)
{
printf("Val is less than Val2\n");
}
}
Nếu kiểu dữ liệu là unsigned char
thì không tràn.
#include<stdio.h>
main()
{
unsigned char Val = 0xFF-15, Val2 = 0xFF;
if (Val+16 < Val2)
{
printf("Val is less than Val2\n");
}
}
Tôi có hai câu hỏi:
- Có giá trị
Val
được thăng tiến đến kiểu dữ liệu cao khi kiểu dữ liệu là unsigned char?- Nếu có, tại sao quảng cáo không được thăng hạng từ 32 bit đến 64 bit
unsigned long
?
Đây không phải là của thập niên 90 - kiểu trả về trên 'main' là bắt buộc hiện nay. – InternetAussie
Khi thực hiện phép tính số học, mọi thứ được quảng bá thành 'int' nếu có thể phù hợp, hoặc thành' unsigned int' nếu không thể. Kích thước của các loại này là cụ thể cho trình biên dịch của bạn và bạn có thể dễ dàng tìm thấy nó. –