我已经进行了一些快速测试,发现在C语言中将
我想知道的是这个行为是由C标准保证的还是仅仅是普遍但不百分之百确定的行为?
signed int
转换为unsigned int
不会改变位值(通过在线调试器验证)。我想知道的是这个行为是由C标准保证的还是仅仅是普遍但不百分之百确定的行为?
signed int
转换为unsigned int
在使用二进制补码实现的C语言编译器(这是最常见的情况)时,不会改变位表示,但会改变负数的位表示,包括可能的负零,在反码或原码系统中都是如此。(unsigned int) a
未定义为保留位,但结果是将a
除以UINT_MAX + 1
的正余数(或类似于C标准(C11 6.3.1.3p2)所述):
对于负数的二进制补码表示法是用于带符号数的最常用表示法正是因为它具有负值该值由重复加或减新类型中可以表示的最大值加一的值,直到该值位于新类型的范围内。
n
映射为数学值n + UINT_MAX + 1
的相同位模式的性质——这使得可以使用相同的机器指令进行带符号和无符号加法,而负数将因环绕而起作用。将有符号整数强制转换为无符号整数是必要的,以生成正确的算术结果(相同的数字),模无符号整数的大小,可以这么说。也就是说,在进行强制转换后,会得到相同的数字,但被无符号整数的大小所限制。
int i = anything;
unsigned int u = (unsigned int)i;
int
转换为float
时,表示法会发生变化,这时情况就有所不同了。 - Weather Vaneint
值的和,而不用担心int
溢出的风险,那么这是安全的。 - Weather Vane