我做了一些快速测试,一个signed int
以unsigned int
用C投不改变位值(上的在线调试器)。
我想知道的是它是由C标准保证还是仅由常见(但不是100%肯定)行为保证?
从转换signed int
到unsigned int
不改变位表示的二进制补码C实现,这是最常见的,但会改变位表示为负数,其中包括可能的负零的补或签后换的幅度系统。
这是因为铸造(unsigned int) a
时不定义为保留位,但结果是正余数除以a
由UINT_MAX + 1
(或为C标准(C11 6.3.1.3p2)表示,
通过反复添加或减去比新类型中可以表示的最大值多一个值来转换该值,直到该值在新类型的范围内为止。
负数的二进制补码表示形式是有符号数的最常用表示形式,正是因为它具有将负值n
映射到与数学值相同的位模式的这种特性n + UINT_MAX + 1
-使得对有符号和无符号使用相同的机器指令成为可能另外,由于回绕,负数将起作用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句