我做了一些快速测试,一个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-使得对有符号和无符号使用相同的机器指令成为可能另外,由于回绕,负数将起作用。