普通字符在非二进制补码系统上通常/总是无符号吗?

时间:2011-05-29 00:03:28

标签: c twos-complement unsigned-char

显然标准对此没有任何说明,但我从实际/历史角度更感兴趣:非二进制补码算法的系统是否使用了未签名的普通char类型?否则,您可能存在各种奇怪现象,例如null终止符的两个表示形式,以及无法表示char中的所有“字节”值。这个奇怪的系统真的存在吗?

3 个答案:

答案 0 :(得分:6)

用于终止字符串的空字符永远不会有两个表示形式。它的定义如此(即使在C90中):

  

所有位都设置为0的字节,称为空字符,应存在于基本执行字符集

因此,对于一个补码的'负零'不会。

那就是说,我真的对非二进制补C实现知之甚少。我在大学期间使用了一个补充机器的方式,但是不记得太多了(即使我当时关心标准,它还存在之前)。

答案 1 :(得分:5)

事实上,对于商业化生产的计算机(1950年代和60年代)的前10年或20年,显然存在一些关于如何用二进制表示负数的一些分歧。实际上有三个竞争者:

  1. 两个补充,不仅赢得了战争,而且还驱使其他人灭绝
  2. 一个补充, -x == ~x
  3. Sign-magnitude, -x = x ^ 0x80000000
  4. 我认为最后一个重要的补充机器可能是CDC-6600,当时是地球上最快的机器,也是第一台超级计算机的前身。 1.

    不幸的是,你的问题无法得到真正的回答,不是因为这里没有人知道答案:-)但是因为选择从来没有必要。这实际上是出于两个的原因:

    1. 两个补码同时接管字节机。 Byte寻址通过二进制补充IBM System / 360在世界上崭露头角。以前的机器没有字节,只有完整的有地址。有时程序员会在这些单词中包含字符,有时他们只会使用整个单词。 (字长从12位到60位不等。)

    2. C字节机器和二进制补码转换后十年才被发明。项目#1发生在20世纪60年代,C在20世纪70年代首次出现在小型机器上,直到20世纪80年代才开始接管世界。

    3. 因此,从来没有一个机器有签名字节,C编译器和二进制补码数据格式以外的东西。以null结尾的字符串的想法可能是由一个汇编语言程序员一个接一个地思考的反复发明的设计模式,但我不知道它是由编译器指定的,直到C时代。

      在任何情况下,第一个实际标准化的C (“C89”)只是指定“一个字节或值为零的代码被附加”并且很明显他们试图以数字格式独立的背景。所以,“+ 0”是一个理论上的答案,但它在实践中可能永远不存在。


      1。 6600是历史上最重要的机器之一,而不仅仅是因为它很快。由Seymour Cray自己设计,它引入了无序执行和后来统称为“RISC”的各种其他元素。虽然其他人试图声称信用,但Seymour Cray是RISC架构的真正发明者。毫无疑问他发明了超级计算机。实际上很难说出他没有设计的过去的“超级计算机”。功能

答案 2 :(得分:2)

我认为系统几乎可能不太可能有一个补充'char'类型,但有四个问题无法解决:

  1. 每个数据类型必须可以表示为char序列,这样如果包含两个对象的所有char值比较相同,则包含有问题的数据对象将是相同的。
  2. 每个数据类型必须同样可以表示为“unsigned char”序列。
  3. 可以分解任何数据类型的unsigned char值必须形成一个顺序为2的幂的组。
  4. 我不相信该标准允许一个补充机器特殊情况下的负值为零,并使其表现为其他东西。

如果获得负零的唯一方法是覆盖其他一些数据类型,并且如果负零比较,则可能有一个符合标准的机器具有一个补码或符号大小的“char”类型不等于正零。我不确定这是否符合标准。

修改

顺便说一句,如果要求#2放宽了,我想知道将其他数据类型覆盖到'char'时的确切要求是什么?除此之外,虽然标准清楚地表明,必须能够对可能因将另一个变量覆盖到“char”而导致的任何“char”值执行赋值和比较,但我不知道它强加了任何要求所有这些值必须表现为算术组。例如,我想知道机器的合法性是什么,其中每个存储器位置物理存储为66位,前两位指示值是64位整数,32位存储器句柄加32位偏移,或64位双精度浮点数?由于标准允许实现在算术计算超出有符号类型的范围时执行任何他们喜欢的操作,这表明签名类型不一定必须表现为组。

对于大多数签名类型,不要求该类型不能表示limits.h中指定范围之外的任何数字;如果limits.h指定最小“int”是-32767,那么实现实际上允许值为-32768是完全合法的,因为任何试图这样做的程序都会调用Undefined Behavior。关键问题可能是由于某种其他类型的叠加产生的'char'值是否合法产生一个超出limits.h中指定范围的值。我想知道标准是什么意思?