假设-LLONG_MAX
(否定的LLONG_MAX
)属于long long
范围是否安全?
假设如果LLONG_MIN < -LLONG_MAX
那么LLONG_MIN == -LLONG_MAX - 1
是安全的吗?
是由标准保证,还是所有实际设备都提供LLONG_MIN == -LLONG_MAX - 1
或LLONG_MIN == -LLONG_MAX
?
假设
-LLONG_MAX
(否定的LLONG_MAX
)属于long long
范围是否安全?假设如果
LLONG_MIN < -LLONG_MAX
那么LLONG_MIN == -LLONG_MAX - 1
是安全的吗?是标准保证还是所有实际设备都提供
LLONG_MIN == -LLONG_MAX - 1
或LLONG_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机器上。