我知道 unsigned int 不能存储负数值。但是下面的代码可以编译通过,没有任何错误/警告。
我知道无符号整型不能存储负数值,但下面的代码可以编译通过而不产生任何错误或警告。
unsigned int a = -10;
当我打印变量a时,输出的值是错误的。如果无符号变量不能保存有符号值,为什么编译器允许它们编译而不给出任何错误/警告呢?
有什么想法吗?
编辑
编译器: VC++编译器
解决方案
需要使用警告级别4。
我知道 unsigned int 不能存储负数值。但是下面的代码可以编译通过,没有任何错误/警告。
我知道无符号整型不能存储负数值,但下面的代码可以编译通过而不产生任何错误或警告。
unsigned int a = -10;
当我打印变量a时,输出的值是错误的。如果无符号变量不能保存有符号值,为什么编译器允许它们编译而不给出任何错误/警告呢?
有什么想法吗?
编辑
编译器: VC++编译器
解决方案
需要使用警告级别4。
警告 C4245: 'initializing' : 从'int'转换为'unsigned int',有符号/无符号类型不匹配
在警告级别4。
给出以下警告:
警告:将负值
-0x00000000a'
转换为无符号整数'
没有任何-W指令。
您必须使用:
gcc main.c -Wconversion
这将会给出以下警告:
警告:负整数隐式地转换为无符号类型
请注意,-Wall将不会启用此警告。
也许您只需要提高警告级别。
signed int
转换为 unsigned int
是C标准中已知的 "通常算术转换",因此不是错误。我正在使用 g++ 4.9.2,并需要使用 -Wsign-conversion 选项来显示此警告。
gcc.gnu.org: 在 C++ 中,除非显式启用 -Wsign-conversion 选项,否则默认情况下不会发出关于有符号和无符号整数之间转换的警告。
-10被解析为整数值,将int赋值给unsigned int是允许的。要知道是否做错了什么,编译器必须检查您的整数(-10)是负数还是正数。由于这不仅仅是类型检查,我猜测它已经因性能问题而被禁用。
对于gcc编译器,您可以添加以下内容
gcc -Wconversion ...
这将会产生以下警告
warning: converting negative value '-0x0000000000000000a' to 'unsigned int'