C ++标准是否要求有符号整数只有一个符号位?

时间:2016-01-18 19:09:29

标签: c++ c++11 integer standards language-lawyer

考虑C ++的基本有符号整数类型,即:signed charshort intintlong intlong 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 ++中是否存在类似的东西

4 个答案:

答案 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.在这样的情况下 实现时,有必要检查两位而不是一位 确定一个数字是负数还是非负数。