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

Nav*_*K N 17 c++ variables unsigned compiler-errors compiler-warnings

我知道unsigned int不能保持负值.但是以下代码编译时没有任何错误/警告.

unsigned int a = -10;
Run Code Online (Sandbox Code Playgroud)

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

有什么想法吗?

编辑

编译器:VC++编译器

需要使用警告级别4.

GMa*_*ckG 16

Microsoft Visual C++:

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

在警告级别4.

G ++

给我警告:

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

没有任何-W指令.

GCC

你必须使用:

gcc main.c -Wconversion

哪个会发出警告:

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

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


也许你只需要提高你的警告水平.


Mic*_*urr 13

转换signed int到一个unsigned int东西在C标准作为一个"正常的算术转换"之称,所以它不是一个错误.

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

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