繁体   English   中英

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

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

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

如果LLONG_MIN < -LLONG_MAX然后LLONG_MIN == -LLONG_MAX - 1 ,是否可以安全地假设?

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

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

如果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的补码或符号和幅度:

C11 6.2.6.2整数类型

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

- 符号位0的相应值被否定(符号和幅度);
- 符号位的值为 - (2M)(二进制补码);
- 符号位的值为 - (2M - 1)(补码)。

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

C ++ 14 3.9.1基本类型:

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

脚注51定义了“纯二进制数字系统”的含义,似乎排除了十进制系统,也偏移了系统(其中0不是所有位零):

51)使用二进制数字0和1的整数的位置表示,其中由连续位表示的值是加性的,以1开始,并且乘以2的连续积分幂,除了可能对于具有最高位置的位。

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

不会。标准没有规定两个补码整数表示。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM