Tôi có mã sử dụng so sánh các số nguyên 64 bit. Nó trông tương tự như sau:Cảnh báo so sánh hiệu chỉnh trong g + +
#include <cstdio>
long long getResult()
{
return 123456LL;
}
int main()
{
long long result = getResult();
if (result > 0x000FFFFFFFFFFFFFLL
|| result < 0xFFF0000000000000LL)
{
printf("Something is wrong.\n");
if (result > 0x000FFFFFFFFFFFFFLL
|| result < -4503599627370496LL)
{
printf("Additional check failed too.\n");
}
else
{
printf("Additional check went fine.\n");
}
}
else
{
printf("Everything is fine.\n");
}
return 0;
}
Khi mã này được biên soạn trong g ++ (thử phiên bản khác nhau trên Ubuntu 12.04 x64: 4.6.3, 4.6.4, 4.7.3, 4.8.0) với cờ Wall -pedantic -std = C++ 0x test.cpp -o thử nghiệm tôi nhận được -Wsign-so sánh cảnh báo cho dòng thứ hai của người đầu tiên câu lệnh if (đầu ra từ g ++ - 4.8):
test.cpp:13:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
|| result < 0xFFF0000000000000LL)
^
Và khi chương trình thử nghiệm được chạy Tôi nhận được hai dòng văn bản:
Something is wrong.
Additional check went fine.
Khi biên dịch cùng một mã trên Windows sử dụng MS Visual Studio 11 Express Cập nhật 2 với các tùy chọn mặc định dự án cho một trong hai x86 hoặc x64 kiến trúc Tôi không nhận được không phải cảnh báo cũng không ra này, thay vì đầu ra là:
Everything is fine.
Is nó là một vấn đề trong mã? Nếu có, bạn có thể chỉ ra nó? Hoặc nó là một vấn đề với trình biên dịch được sử dụng?
Thêm phép loại bổ sung cho hằng số thứ hai trong câu lệnh if đầu tiên sẽ xóa cảnh báo trong g ++.
Đó là một câu hỏi hay, bao gồm một ví dụ hoàn chỉnh và tất cả các thông tin liên quan. –
'0xFFF0000000000000', dưới dạng giá trị dương, không vừa trong thời gian dài. Tuy nhiên, nó phù hợp trong một unsigned dài lâu, do đó, đó là loại gcc sử dụng. –
Hậu tố 'LL' có thể được sử dụng để buộc trình biên dịch chọn loại dài hơn (' 1LL' dài), nhưng không chọn loại nhỏ hơn, bạn muốn một dàn diễn viên ('long long) 0xFFF0000000000000' (nghiêm chỉnh nói điều này được thực hiện xác định)). –