在C中对无符号强制转换是否更改位值

Gui*_*ean 2 c integer casting

我做了一些快速测试,一个signed intunsigned int用C投不改变位值(上的在线调试器)。

我想知道的是它是由C标准保证还是仅由普通(但不是100%肯定)行为保证?

Ant*_*ala 7

从转换signed intunsigned int不改变位表示二进制补码C实现,这是最常见的,但会改变位表示为负数,其中包括可能的负零的补签后换的幅度系统。

这是因为铸造(unsigned int) a定义为保留位,但结果是正余数除以aUINT_MAX + 1(或为C标准(C11 6.3.1.3p2)表示,

通过反复在新类型中可以表示的最大值加上或减去一个以上的值来转换该值,直到该值在新类型的范围内为止。

负数的二进制补码表示形式是有符号数的最常用表示形式,正是因为它具有将负值n映射到与数学值相同的位模式的这种特性n + UINT_MAX + 1-使得对有符号和无符号使用相同的机器指令成为可能另外,由于回绕,负数将起作用。