C 在非twos补码系统上,纯字符通常/总是无符号的吗?

C 在非twos补码系统上,纯字符通常/总是无符号的吗?,c,twos-complement,unsigned-char,C,Twos Complement,Unsigned Char,很明显,标准没有提到这一点,但我更感兴趣的是从实际/历史的角度来看:使用非twos补码算法的系统是否使用了无符号的纯char类型?否则,您可能会有各种各样的奇怪之处,比如空终止符的两种表示,以及无法在char中表示所有“字节”值。这种奇怪的系统真的存在吗?用于终止字符串的空字符不能有两种表示形式。它的定义是这样的(即使在C90中): 基本执行字符集中应存在所有位均设置为0的字节,称为空字符 所以1的补码上的“负零”是不行的 也就是说,我对non-two的补码C实现知之甚少。早在大学时,我就用过补

很明显,标准没有提到这一点,但我更感兴趣的是从实际/历史的角度来看:使用非twos补码算法的系统是否使用了无符号的纯
char
类型?否则,您可能会有各种各样的奇怪之处,比如空终止符的两种表示,以及无法在
char
中表示所有“字节”值。这种奇怪的系统真的存在吗?

用于终止字符串的空字符不能有两种表示形式。它的定义是这样的(即使在C90中):

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

所以1的补码上的“负零”是不行的


也就是说,我对non-two的补码C实现知之甚少。早在大学时,我就用过补码机,但对它记忆犹新(即使我当时关心这个标准,它还是在它出现之前)。

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

  • 二者相辅相成,不仅赢得了战争,还将其他人推向灭绝
  • 一个人的补语,
    -x==~x
  • 符号大小,
    -x=x^0x8000000
  • 我认为最后一台重要的计算机可能是CDC-6600,当时它是地球上最快的计算机,也是第一台超级计算机的前身

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

  • 2的补码与字节机同时接管。字节寻址以IBM System/360的两个补充而闻名于世。以前的机器没有字节,只有完整的字有地址。有时程序员会在这些单词中填充字符,有时他们只会使用整个单词。(字长从12位到60位不等。)

  • 直到字节机和补码转换后的十年,C才被发明。第一项发生在20世纪60年代,C在20世纪70年代首次出现在小型机器上,直到20世纪80年代才开始统治世界

  • 因此,从来就没有一台机器拥有签名字节、C编译器和除twos补码数据格式之外的其他东西。空终止字符串的想法可能是一个又一个汇编语言程序员反复发明的设计模式,但直到C时代,我才知道它是由编译器指定的

    在任何情况下,第一个实际标准化的C(“C89”)只是指定“附加一个值为零的字节或代码”,从上下文中可以清楚地看出,它们试图独立于数字格式。所以,“+0”是一个理论上的答案,但它可能在实践中从未真正存在过



    一,。6600是历史上最重要的机器之一,不仅仅是因为它速度快。由西摩·克雷亲自设计,它引入了无序执行和其他各种元素,后来统称为“RISC”。尽管其他人试图获得赞誉,但西摩·克雷是RISC体系结构的真正发明者。毫无疑问,他发明了超级计算机。事实上,很难说出一台不是他设计的过去的“超级计算机”

    我相信一个系统有一个补码“char”类型几乎是不可能的,但有四个问题不能全部解决:

  • 每个数据类型都必须可以表示为一个字符序列,这样,如果包含两个对象的所有字符值比较相同,则所涉及的数据对象将是相同的。
  • 同样,每个数据类型都必须表示为“unsigned char”序列。
  • 任何数据类型可以分解成的无符号字符值必须形成一个顺序为二次幂的组。
  • 我不相信标准允许一补机器在特殊情况下使用负零的值,并使其表现为其他值。 如果获得负零的唯一方法是叠加其他数据类型,并且如果负零与正零相比不相等,则可能有一台具有1的补码或符号大小“char”类型的符合标准的机器。我不确定这是否符合标准

    编辑

    顺便说一句,如果需求#2被放宽,我想知道当将其他数据类型覆盖到“char”上时,确切的需求是什么?除其他事项外,虽然该标准非常清楚地表明,必须能够对任何“char”值执行赋值和比较,这些值可能是由于将另一个变量叠加到“char”上而产生的,但我不知道它是否强制要求所有这些值必须作为算术组。例如,我想知道一台机器的合法性是什么,在这种机器中,每个内存位置都物理存储为66位,最上面的两位表示该值是64位整数、32位内存句柄加32位偏移量还是64位双精度浮点数?由于该标准允许实现在算术计算超出有符号类型的范围时执行任何他们喜欢的操作,因此这意味着有符号类型不一定必须作为一个组来执行

    对于大多数有符号类型,不要求该类型不能表示limits.h中指定范围之外的任何数字;如果limits.h指定最小“int”为-32767,那么实现实际上允许值为-32768是完全合法的,因为任何尝试这样做的程序都会