考虑C ++的基本有符号整数类型,即:signed char
,short int
,int
,long int
和long long int
,当前的C ++标准是什么需要关于它们的基础位表示?
它们的位表示的约束是否指定它们应包括:
0
表示正值,1
表示负值这是真的吗?如果没有,那么什么是圣徒?我正在寻找证明或证明这一点的标准的引用。
编辑:我在问这个问题,因为在C中,标准说:
6.2.6.2.2:
对于有符号整数类型,对象表示的位应为 分为三组:值位,填充位和符号 位。不需要任何填充位;签名字母不得 任何填充位。应该只有一个符号位。每一点 值位应与对象中的相同位具有相同的值 相应的无符号类型的表示(如果有M 有符号类型中的值位和无符号类型中的N,则M≤N )。如果符号位为零,则不应影响结果值。 如果符号位为1,则应在其中一个中修改该值 以下方式:
- 符号位0的对应值被否定(符号和幅度);
- 符号位的值为 - (2 ^ M)(二进制补码);
- 符号位的值为 - (2 ^ M - 1)(单个实现)。
其中哪一个适用于实现定义,原样 符号位1和所有值位的值是否为零(对于 前两个),或带符号位和所有值位1(对于' 补码),是陷阱表示或正常值。在这种情况下 如果这个表示是,那么符号和幅度以及一个补码 一个正常值,它被称为负零。
所以我想知道C ++中是否存在类似的东西
答案 0 :(得分:4)
这就是C ++ 11关于有符号整数类型表示的说法:
C ++ 11 N3337 3.9.1 [basic.fundamental] P7:
整数类型的表示 应使用纯二进制计算系统定义值。 49 [例子:本国际标准允许积分类型的2的补码,1的补码和带符号的幅度表示。 - 结束 例子]
脚注49所示:
49)使用二进制数字0和1的整数的位置表示,其中由连续位表示的值是加法的,以1开始,并且乘以2的连续积分幂,除了可能的位最高的 位置。 (改编自美国国家信息处理系统词典。)
因此,C ++允许与C相同的三个选项,以及满足脚注49的任何其他选项。这是C允许的超集。但是,根据脚注49,只允许最高位具有特殊含义。
答案 1 :(得分:3)
我猜你问的答案是否答案。
我认为C ++标准规定了每个整数类型必须能够表示的最小大小和值范围。我不相信该标准特别针对您列出的任何约束。
我认为这些都是实施细节。
我认为找到一个使用多个位来保存符号的C ++实现会很奇怪,而不是使用0表示正数而1表示负数。但我不认为C ++标准特别要求它。
答案 2 :(得分:2)
C ++标准特别基于C标准编写(6.2.6.2整数类型)
2对于有符号整数类型,对象表示的位 应分为三组:值位,填充位和 标志位。不需要任何填充位;签名字母不得 有任何填充位。 只有一个符号位 .....
答案 3 :(得分:0)
要求只有一个符号位意味着必须能够识别为所有负数设置的位,并清除所有非负数。实现可以在“int”内包括任意数量的填充位,对其值施加任意限制,并将任何违反这些要求的位模式视为陷阱表示,前提是所有产生定义的整数值的计算产生实现的位模式会接受。
例如,实现可以将“int”存储为两个16位字,并指定第一个字的MSB是符号位。这样的实现可以写出第一个字的0-14与符号位匹配 在读取任何不存在的值时陷阱,或使这些位匹配位 第二个单词的1-15(同样是陷印),或者可以写出任意值 在阅读时忽略它们,或者做其他任何事情 跟他们。如果一个实现总是将首字写为全部或者 全部为零,任何位都可以被指定为“符号位”并且无关紧要; 其余的都是“填充位”。
要求单个符号位主要排除 实现,例如,正数可以任意表示 作为位模式00或11,负数为01或10.在这样的情况下 实现时,有必要检查两位而不是一位 确定一个数字是负数还是非负数。