有符号整数类型的最小值和最大值之间关系的C++标准保证是什么
What are C++ Standard guarantees on relation between min and max values of signed integer types?
假设-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机器上。
- 使用CMake检测支持的C++标准
- 如何理解C++标准N3337中的expr.const.cast子句8
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- 编译标准库类型
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 编译器如何在使用SFINAE的函数和标准函数之间确定两者是否可行
- C++GTKMM gui循环依赖关系
- 铸造标准::有没有回到原来的类型
- 标准 N3337 5.2.10 第 7 条中的C++"类型"是什么意思?
- this_thread::sleep_for和计时时钟之间的关系是否由C++11标准指定
- 标准库类型的赋值运算符的引用限定符
- C++ 标准库是否比 winAPI 具有更多的环境依赖关系?
- 酿造警告:依赖关系是使用不同的C 标准库构建的
- C标准和C++标准之间的关系是什么?
- 定义浮点等价关系的标准方法
- 什么是 ABI,为什么C++没有标准,如果有的话又有什么关系?
- C 和C++标准库之间的关系
- 有符号整数类型的最小值和最大值之间关系的C++标准保证是什么
- 标准::unique_lock<mutex>和conditional_variable的关系
- 是否有任何标准的包含顺序来避免隐藏的依赖关系