【发布时间】:2015-09-14 08:05:41
【问题描述】:
我有以下代码:
#include <iostream>
using namespace std;
int main()
{
int a = 0x80000000;
if(a == 0x80000000)
a = 42;
cout << "Hello World! :: " << a << endl;
return 0;
}
输出是
Hello World! :: 42
所以比较有效。但是编译器告诉我
g++ -c -pipe -g -Wall -W -fPIE -I../untitled -I. -I../bin/Qt/5.4/gcc_64/mkspecs/linux-g++ -o main.o ../untitled/main.cpp
../untitled/main.cpp: In function 'int main()':
../untitled/main.cpp:8:13: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if(a == 0x80000000)
^
所以问题是:为什么 0x80000000 是一个无符号整数?我可以让它以某种方式签名以消除警告吗?
据我了解,0x80000000 将是 INT_MIN,因为它超出了正整数的范围。但是为什么编译器会假设我想要一个正数?
我在 linux 上使用 gcc 版本 4.8.1 20130909 进行编译。
【问题讨论】:
-
“但是为什么编译器会假设我想要一个正数”——因为你没有使用减号?!
-
我刚刚测试过:
warning: comparison between signed and unsigned integer expressions [-Wsign-compare] if(a == -0x80000000)所以它还在抱怨 -
嗯,是的,字面量太大,无法放入
signed int,因此编译器将其设为unsigned。 -
等号右边的类型不是由左边的类型决定的。
标签: c++