【发布时间】:2021-11-13 18:13:08
【问题描述】:
我很想知道如果我将一个负值赋给一个无符号变量会发生什么。
代码看起来有点像这样。
unsigned int nVal = 0;
nVal = -5;
它没有给我任何编译器错误。当我运行程序时,nVal 被分配了一个奇怪的值!会不会是某个 2 的补码值被分配给了nVal?
【问题讨论】:
-
我的预感(尚未在标准中找到它)是该行为在技术上是未定义的。此外,我怀疑您会在几乎可以找到的任何编译器上看到您所期望的。因此,虽然您通常会看到这种行为,但依靠它可能不是一个好主意。
-
它不是未定义的(参见 §4.7/2),但表示(例如 2s 补码)不是标准规定的。
-
@gf(以下等),很酷。看起来行为实际上已明确定义为您所期望的,@viswanathan。
-
第二行相当于
nVal = (unsigned int) -5;。-5到unsigned int的转换在 6.3.1.3 中定义。 2s 补码中的表示不是标准规定的,但转换为无符号的算法是:“通过重复加或减一个比新类型中可以表示的最大值多一的方式转换值,直到该值在范围内新类型的。” -
@Pascal:您似乎指的是 C99,但问题标记为 C++。
标签: c++ type-conversion integer unsigned signed