为符号值分配给无符号整数时,为什么编译器没有给出错误? - C ++

时间:2009-04-19 16:57:24

标签: c++ variables compiler-errors compiler-warnings unsigned

我知道 unsigned int 不能保存负值。但是下面的代码编译时没有任何错误/警告。

unsigned int a = -10;

当我打印变量 a 时,我打印出错误的值。如果无符号变量不能保存有符号值,为什么编译器允许它们编译而不给出任何错误/警告?

有什么想法吗?

修改

编译器:VC ++编译器

解决方案

需要使用警告级别4。

5 个答案:

答案 0 :(得分:16)

Microsoft Visual C ++:

  

警告C4245:'初始化':   从'int'转换为'unsigned   int',有符号/无符号不匹配

警告级别4。

G ++

给我警告:

  

警告:转换负值   -0x00000000a' to unsigned int'

没有任何-W指令。

GCC

您必须使用:

  

gcc main.c -Wconversion

会发出警告:

  

警告:负整数隐式转换为无符号类型

请注意,-Wall不会启用此警告。


也许您只需要提高警告级别。

答案 1 :(得分:13)

signed int转换为unsigned int在C标准中称为“常用算术转换”,因此它不是错误。

编译器默认情况下通常不对此发出警告的原因是因为在代码中通常会这样做,因此通常会发出太多“误报”警告。有很多代码可以使用signed int值来处理本质上无符号的事物(例如计算缓冲区大小)。在表达式中混合有符号和无符号值也很常见。

这并不是说这些无声转换不对错误负责。因此,为新代码启用警告可能并不是一个坏主意,因此它从一开始就是“干净”的。但是,我认为您可能会发现处理现有代码发出的警告时非常压倒性。

答案 2 :(得分:2)

-10被解析为整数值,并允许将int赋值给unsigned int。要知道你做错了什么,编译器必须检查你的整数(-10)是负数还是正数。由于它不仅仅是一种类型检查,我猜它已因性能问题而被禁用。

答案 3 :(得分:1)

对于gcc编译器,您可以添加

gcc -Wconversion ...

这将产生以下警告

warning: converting negative value '-0x0000000000000000a' to 'unsigned int'

答案 4 :(得分:0)

我正在使用g ++ 4.9.2并且需要使用-Wsign-conversion来显示此警告。

  

gcc.gnu.org:   默认情况下,在C ++中禁用有符号和无符号整数之间的转换警告,除非明确启用了-Wsign-conversion。