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

What are C++ Standard guarantees on relation between min and max values of signed integer types?

本文关键字:标准 关系 C++ 是什么 之间 最大值 整数 符号 类型 最小值      更新时间:2023-10-16

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

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

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

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

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

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


如果实现使用2的补码、1的补码或符号和幅度中的一个来表示有符号整数类型,那么这三种说法是正确的。在所有三种方案中,-LLONG_MAX都在long long的范围内,并且LLONG_MIN-LLONG_MAX(1的补码、符号和幅度,并且可能是2的补码)或者是-LLONG_MAX-1(可能是2补码)。2的补码机可能会使用该额外值作为陷阱表示,就像1的补码和正负号机可能使用负零作为陷阱表示一样。因此,如果标准要求实施使用其中一个方案,那么您的问题的答案是"是"。

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

C116.2.6.2整数类型:

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

--符号位为0的对应值被否定(符号和幅度)
--符号位具有值−(2M)(二的补码)
--符号位的值为−(2M−1)(1的补码)。

C++标准似乎更加开放:

C++143.9.1基本类型:

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

脚注51定义了"纯二进制记数系统"的含义,似乎排除了十进制和偏移量系统(其中0不是所有比特都为零):

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

实际上,剩下的只有2的补码、1的补码以及符号和幅度:与C标准规定的方案相同。我怀疑供应商是否会接触到一台使用21世纪新方案来表示整数的机器,并且在某种程度上符合C++标准的字母定律(但因此不符合C)。

否。本标准未规定二的补码整数表示。

也就是说,绝大多数的C和C++实现都在2的comp机器上。