我知道unsigned int不能保存负值。但是以下代码编译时没有任何错误/警告。
unsigned int a = -10;
当我打印变量a时,我打印了一个错误的值。如果无符号变量不能保存有符号值,为什么编译器允许它们编译而不给出任何错误/警告?
有什么想法吗?
编辑
编译器:VC++编译器
解决方案
需要使用警告级别 4。
我知道unsigned int不能保存负值。但是以下代码编译时没有任何错误/警告。
unsigned int a = -10;
当我打印变量a时,我打印了一个错误的值。如果无符号变量不能保存有符号值,为什么编译器允许它们编译而不给出任何错误/警告?
有什么想法吗?
编辑
编译器:VC++编译器
解决方案
需要使用警告级别 4。
警告 C4245:“正在初始化”:从“int”转换为“unsigned int”,有符号/无符号不匹配
处于警告级别 4。
给我警告:
警告:负值
-0x00000000a' to
unsigned int' 的转换
没有任何 -W 指令。
您必须使用:
gcc main.c -Wconversion
这将给出警告:
警告:负整数隐式转换为无符号类型
请注意, -Wall 不会启用此警告。
也许您只需要提高警告级别。
将 a 转换signed int
为 anunsigned int
在 C 标准中称为“通常的算术转换”,因此这不是错误。
编译器默认情况下通常不会对此发出警告的原因是因为它在代码中很常见,通常会发出太多的“误报”警告。有很多代码可以使用signed int
值来处理本质上无符号的事物(例如计算缓冲区大小)。在表达式中混合有符号和无符号值也很常见。
这并不是说这些静默转换不对错误负责。因此,为新代码启用警告可能不是一个坏主意,因此它从一开始就“干净”。但是,我认为您可能会发现处理现有代码发出的警告相当困难。
-10 被解析为整数值,并且允许将 int 分配给 unsigned int。要知道您做错了什么,编译器必须检查您的整数 (-10) 是负数还是正数。由于它不仅仅是类型检查,我猜它已因性能问题而被禁用。
我正在使用 g++ 4.9.2,需要使用 -Wsign-conversion 来显示此警告。
gcc.gnu.org: Warnings about conversions between signed and unsigned integers are disabled by default in C++ unless -Wsign-conversion is explicitly enabled.
对于 gcc 编译器,您可以添加
gcc -Wconversion ...
这将产生以下警告
warning: converting negative value '-0x0000000000000000a' to 'unsigned int'