首页 文章

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

提问于
浏览
1

考虑C的基本有符号整数类型,即: signed charshort intintlong intlong long int ,当前C标准对其基础位表示要求什么?

它们的位表示的约束是否指定它们应包括:

  • 可选填充位

  • 强制值位

  • 强制符号位,对于正值为 0 ,对于负值为 1

  • 如果存在,则符号位应该是最重要的位

这是真的?如果没有,那么什么是圣徒?我正在寻找证明或证明这一点的标准的引用 .

EDIT: 我问这个问题,因为在C中,标准说:

6.2.6.2.2:对于有符号整数类型,对象表示的位应分为三组:值位,填充位和符号位 . 不需要任何填充位; signed char不应有任何填充位 . 应该只有一个符号位 . 作为值位的每个位应具有与相应无符号类型的对象表示中的相同位相同的值(如果有符号类型中有M个值位且无符号类型中有N,则M≤N) . 如果符号位为零,则不应影响结果值 . 如果符号位为1,则应以下列方式之一修改该值:符号位0的相应值被否定(符号和幅度);符号位的值为 - (2 ^ M)(二进制补码);符号位的值为 - (2 ^ M - 1)(单个实现) . 这些适用中的哪一个是实现定义的,将符号位1和所有值位0(对于前两个),或者符号位和所有值位1(对于1'补码)的值是否是陷阱表示或正常值 . 在符号和幅度以及1'补码的情况下,如果该表示是正常值,则称为负零 .

所以我想知道C中是否存在类似的东西

4 回答

  • 3

    这就是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,只允许最高位具有特殊含义 .

  • 2

    我猜你问的问题答案是否定的 .

    我认为C标准规定了最小大小,以及每个整数类型必须能够表示的值范围 . 我不相信该标准专门针对您列出的任何约束 .

    我认为这些都是实施细节 .

    我认为找到一个使用多个位来保持符号的C实现是奇怪的,而不是使用0表示正数而1表示负数 . 但我不认为C标准特别要求它 .

  • 0

    C标准特别基于C标准,其中有(6.2.6.2整数类型)

    2对于有符号整数类型,对象表示的位应分为三组:值位,填充位和符号位 . 不需要任何填充位; signed char不应有任何填充位 . 应该只有一个符号位.....

  • 4

    要求只有一个符号位意味着必须能够识别为所有负数设置的位,并清除所有非负数 . 实现可以在“int”内包括任意数量的填充位,对其值施加任意限制,并将任何违反这些要求的位模式视为陷阱表示,前提是所有产生定义的整数值的计算产生的位模式为实施将接受 .

    例如,实现可以将“int”存储为两个16位字,并指定第一个字的MSB是符号位 . 这样的实现可以写入0-14的第一个字匹配符号位和陷阱,当读取它们没有的任何值,或使这些位匹配第二个字的位1-15(同样陷阱),或者可以写任意这些位的值在读取时忽略它们,或者用它们做任何其他事情 . 如果一个实现总是将顶部字写为全1或全为零,则任何位都可以被指定为“符号位”并且无关紧要;其余的都是“填充位” .

    存在单个符号位的要求将主要排除在例如正数可以任意地表示为位模式00或11,负数可以表示为01或10.在这样的实现中,有必要检查两个位而不是一个来确定数字是负数还是非负数 .

相关问题