什么是C++标准保证有符号整数类型的最小值和最大值之间的关系?

Fyo*_*kov 6 c++ standards integer max min

假设-LLONG_MAX(否定LLONG_MAX)属于long long范围是否安全?

如果LLONG_MIN < -LLONG_MAX那么假设是否安全LLONG_MIN == -LLONG_MAX - 1

它是由标准保证还是只是所有实际设备提供LLONG_MIN == -LLONG_MAX - 1LLONG_MIN == -LLONG_MAX

Dav*_*men 3

\n

假设-LLONG_MAX(neated LLONG_MAX) 属于long long范围是否安全?

\n\n

假设如果LLONG_MIN < -LLONG_MAX那么的话是否安全LLONG_MIN == -LLONG_MAX - 1

\n\n

它是由标准保证的还是只是所有实际设备都提供LLONG_MIN == -LLONG_MAX - 1LLONG_MIN == -LLONG_MAX

\n
\n\n


\n如果实现使用 2 的补码、1 的补码或符号和大小之一来表示有符号整数类型,则这三个陈述成立。-LLONG_MAX在所有三种方案中都在 的范围内long long,并且LLONG_MINis -LLONG_MAX(1 的补码、符号和大小,并且可能是 2 的补码) 或 is -LLONG_MAX-1(可能是 2 的补码)。2 的补码机器可能会使用该额外值作为陷阱表示,就像 1 的补码以及符号和幅度机器可能会使用负零作为陷阱表示一样。因此,如果标准要求实现使用这些方案之一,那么您的问题的答案是“是”。

\n\n

C 标准(C++ 标准在许多地方都遵循该标准)要求使用 2 的补码、1 的补码或符号和大小:

\n\n
\n

C11 6.2.6.2 整数类型

\n\n

如果符号位为1,则应通过以下方式之一修改该值:

\n\n

\xe2\x80\x94 符号位为0的对应值取反(符号和大小);
\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 补码)。

\n
\n\n

C++ 标准似乎更开放一些:

\n\n
\n

C++14 3.9.1 基本类型:

\n\n

整数类型的表示应通过使用纯二进制计数系统51来定义值。[示例:本国际标准允许整数类型的 2\xe2\x80\x99s 补码、1\xe2\x80\x99s 补码和带符号的幅度表示。\xe2\x80\x94结束示例]

\n
\n\n

脚注 51 定义了“纯二进制计数系统”的含义,似乎排除了十进制系统和偏移系统(其中 0 并非所有位都为零):

\n\n
\n

51) 使用二进制数字 0 和 1 的整数位置表示,其中连续位表示的值是相加的,从 1 开始,并乘以连续的 2 的整数幂,最高位置的位除外。

\n
\n\n

实际上,剩下的就是 2 的补码、1 的补码以及符号和大小:与 C 标准规定的方案相同。我怀疑供应商会接触使用新的 21 世纪方案来表示整数并以某种方式满足 C++ 标准的法律条文(但因此不符合 C)的机器。

\n