\n\n\n假设
\n\n-LLONG_MAX(neatedLLONG_MAX) 属于long long范围是否安全?假设如果
\n\nLLONG_MIN < -LLONG_MAX那么的话是否安全LLONG_MIN == -LLONG_MAX - 1?它是由标准保证的还是只是所有实际设备都提供
\nLLONG_MIN == -LLONG_MAX - 1或LLONG_MIN == -LLONG_MAX?
\n如果实现使用 2 的补码、1 的补码或符号和大小之一来表示有符号整数类型,则这三个陈述成立。-LLONG_MAX在所有三种方案中都在 的范围内long long,并且LLONG_MINis -LLONG_MAX(1 的补码、符号和大小,并且可能是 2 的补码) 或 is -LLONG_MAX-1(可能是 2 的补码)。2 的补码机器可能会使用该额外值作为陷阱表示,就像 1 的补码以及符号和幅度机器可能会使用负零作为陷阱表示一样。因此,如果标准要求实现使用这些方案之一,那么您的问题的答案是“是”。
C 标准(C++ 标准在许多地方都遵循该标准)要求使用 2 的补码、1 的补码或符号和大小:
\n\n\n\n\nC11 6.2.6.2 整数类型:
\n\n如果符号位为1,则应通过以下方式之一修改该值:
\n\n\xe2\x80\x94 符号位为0的对应值取反(符号和大小);
\n
\n \xe2\x80\x94 符号位的值为 \xe2\x88\x92(2M ) (两个\xe2\x80\x99s 补码);
\n \xe2\x80\x94 符号位的值为 \xe2\x88\x92(2M \xe2\x88\x92 1) (ones\xe2\x80\x99 补码)。
C++ 标准似乎更开放一些:
\n\n\n\n\nC++14 3.9.1 基本类型:
\n\n整数类型的表示应通过使用纯二进制计数系统51来定义值。[示例:本国际标准允许整数类型的 2\xe2\x80\x99s 补码、1\xe2\x80\x99s 补码和带符号的幅度表示。\xe2\x80\x94结束示例]
\n
脚注 51 定义了“纯二进制计数系统”的含义,似乎排除了十进制系统和偏移系统(其中 0 并非所有位都为零):
\n\n\n\n\n51) 使用二进制数字 0 和 1 的整数位置表示,其中连续位表示的值是相加的,从 1 开始,并乘以连续的 2 的整数幂,最高位置的位除外。
\n
实际上,剩下的就是 2 的补码、1 的补码以及符号和大小:与 C 标准规定的方案相同。我怀疑供应商会接触使用新的 21 世纪方案来表示整数并以某种方式满足 C++ 标准的法律条文(但因此不符合 C)的机器。
\n| 归档时间: |
|
| 查看次数: |
142 次 |
| 最近记录: |