首页 > 解决方案 > C中的有符号到无符号转换是否会更改位值

问题描述

我已经做了一些快速测试,在 C 中转换的 asigned int不会unsigned int更改位值(在在线调试器上)。

我想知道的是它是由 C 标准保证还是只是常见(但不是 100% 确定)行为?

标签: ccastinginteger

解决方案


signed intto的转换unsigned int不会改变二进制补码 C 实现的位表示,这是最常见的,但会改变负数的位表示,包括一个补码符号和大小系统上可能的负零。

这是因为(unsigned int) a未定义强制转换以保留位,但结果是除以的正余数(或如 C 标准(C11 6.3.1.3p2)所说,aUINT_MAX + 1

该值是通过反复加或减新类型所能表示的最大值多一来转换的,直到该值在新类型的范围内。

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


推荐阅读