![](/img/trans.png)
[英]Standard guarantees for aliases of integer types in C/C++? E.g.: Is “unsigned” always equal to “unsigned int”?
[英]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 - 1
或LLONG_MIN == -LLONG_MAX
?
假设
-LLONG_MAX
(否定LLONG_MAX
)属于long long
range是否安全?如果
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的补码或符号和幅度:
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.