c - Tilde C 无符号整数与有符号整数

标签 c operators bit-manipulation tilde

例如:

unsigned int i = ~0;

结果:我可以分配给i

的最大数量

signed int y = ~0;

结果:-1

为什么我得到 -1?我不应该得到可以分配给 y 的最大数量吗?

最佳答案

4294967295(又名 UINT_MAX)和 -1 具有相同的二进制表示 0xFFFFFFFF 或 32 位全部设置为 1。这是因为带符号的数字使用 two's complement 表示.负数的 MSB(最高有效位)设置为 1,其值通过翻转其余位、添加 1 并乘以 -1 来确定。因此,如果您将 MSB 设置为 1 并且其余位也设置为 1,则翻转它们(获得 32 个零),添加 1(得到1)并乘以-1,最终得到-1

这使得 CPU 更容易进行数学运算,因为它不需要负数的特殊异常(exception)。例如,尝试添加 0xFFFFFFFF (-1) 和 1。由于只有 32 位的空间,这将溢出并且结果将如预期的那样为 0

查看更多:

http://en.wikipedia.org/wiki/Two%27s_complement

关于c - Tilde C 无符号整数与有符号整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13147790/

相关文章:

c - 从 url 解析 ipv6 地址

c++ - 为什么 C++ 不允许用户定义运算符?

javascript - Javascript "this"运算符如何处理范围?

c# - 需要帮助了解按位运算符的用法

c - 解析具有特定关键字匹配的文本文件

c - 我需要帮助将结构数组传递给函数

c - 如何提高 memcpy 的性能

java - 为什么我应该总是使用 ||而不是 |和 && 而不是 &?

Android 应用内计费 : securing application public key

c++ - 未定义 int64_t 的按位或?