c - C中的有符号到无符号转换是否会更改位值
问题描述
我已经做了一些快速测试,在 C 中转换的 asigned int
不会unsigned int
更改位值(在在线调试器上)。
我想知道的是它是由 C 标准保证还是只是常见(但不是 100% 确定)行为?
解决方案
从signed int
to的转换unsigned int
不会改变二进制补码 C 实现中的位表示,这是最常见的,但会改变负数的位表示,包括一个补码或符号和大小系统上可能的负零。
这是因为(unsigned int) a
未定义强制转换以保留位,但结果是除以的正余数(或如 C 标准(C11 6.3.1.3p2)所说,a
UINT_MAX + 1
该值是通过反复加或减新类型所能表示的最大值多一来转换的,直到该值在新类型的范围内。
负数的二进制补码表示是有符号数最常用的表示,因为它具有负值n
映射到与数学值相同的位模式的n + UINT_MAX + 1
特性——它使得有符号和无符号使用相同的机器指令成为可能此外,由于环绕,负数将起作用。
推荐阅读
- javascript - 如何根据 Firestore 中的子集合文档值返回父集合?
- android - git checkout 从一个分支到另一个分支删除了所有本地更改。我怎样才能找回它们?
- flutter - Flutter Firebase 电话身份验证未发送短信代码。直接调用 PhoneCodeAutoRetrievalTimeout 方法。这是我的代码
- apache-spark - python作业上的Spark提交过程泄漏
- ios - 复杂视图的iOS测试自动化,UIAccessabilityContainer?
- python - 我如何让程序每次打印不同的响应?
- c# - c# DateTime.Parse 精度问题
- python - 如何使用 `array('f')` 类似的语法定义二维数组
- liferay - 如何在 Liferay 6.2 或 7.2 中显示具有分层数据的数据库的层次结构?
- google-chrome - Chrome 扩展名可以包含谷歌产品名称吗?