c - 为什么C变量的最大值和最小值会接触?

标签 c variables

我正在编写二进制数教程。我一直想知道为什么所有整数最大值和最小值都接触。例如,对于一个无符号字节 255 + 1 = 0 和 0 - 1 = 255。我理解其中的所有二进制数学运算,但为什么决定让它们以这种方式工作而不是给出一个直线数字线突破极限时出错?

最佳答案

由于您的示例是无符号的,我认为可以将范围限制为无符号类型。

允许换行很有用。例如,它允许您(和编译器)始终重新排序(和常量折叠)一系列加法和减法。如果语言需要捕获,即使像 x + 3 - 1 这样的东西也不能优化为 x + 2,因为它改变了表达式捕获的条件。包装也可以更好地与位操作混合,将无符号数解释为位 vector ,如果存在陷阱,则意义不大。这尤其适用于移位,但加法、减法甚至乘法对位 vector 也有意义,并且可以与通常的按位运算有效结合。

当允许换行时,您得到的代数结构 Z/2kZ 相当不错(可能不如素数模好,但那会与位 vector 解释产生不良交互,并且它不会不匹配典型的硬件)并且众所周知,所以它不会发生任何特别意外或奇怪的事情,它不像包装结果是“无用的任意”结果。

当然,在几乎每个操作之后测试进位标志(或任何可能需要的)也有很大的直接开销。

陷入“无符号溢出”既昂贵又不可取,至少如果它是默认行为的话。

关于c - 为什么C变量的最大值和最小值会接触?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37733264/

相关文章:

c - 如何持续监控 Linux 中的进程创建?

c - 在 C 中,他们无论如何都是逐行读取文件内容并将每个整数值(前行)分别存储到数组中的方法吗?

variables - 检查Flask中Jinja2内部的变量类型

batch-file - 调用一个变量,其值是另一个变量的名称

C、UNIX。通过 UNIX 套接字从 execlp 发送输出

c - 带有 Glut 的键盘处理程序

c++ - 如何在 c/c++ 中解析字符串?

mysql - 在 "INSERT ON"子句中使用用户变量

mysql - 如何将变量传递给 mysql 脚本?

javascript - 当且仅当它被使用时,我如何计算 JavaScript 中的变量?