【发布时间】:2021-07-08 20:08:24
【问题描述】:
是否有人知道 C 标准支持的任何平台,这些平台仍在积极的开发工作中,但有:
- 不是 2 的补码或
- 整数宽度不是 32 位或 64 位或
- 某些整数类型具有填充位或
- 如果您在 2 的补码机器上工作,带符号的位模式 位 1 和所有值位为零不是有效的负数或
- 从有符号到无符号的整数转换(反之亦然)不是逐字逐句的 位模式的复制或
- 整数的右移不是算术移位或
- 无符号类型中的值位数不是 相应有符号类型中的值位 + 1 或
- 从更宽的 int 类型转换为更小的类型不是通过 截断不适合的最左边的位
编辑:或者,如果在 1995 年至 1998 年期间有平台影响了 C99 决定包括上述内容,但已停产,我也会对它们感兴趣。
编辑:C 的基本原理是关于填充位的:
用户可以在无符号整数类型中访问填充位。例如,假设一台机器 使用一对 16 位的 short(每个都有自己的符号位)组成一个 32 位的 int,并且在这个 32 位的 int 中使用时忽略较低的 short 的符号位。然后,作为 32 位有符号整数,有一个填充位(在 32 位中间)在确定 32 位有符号整数的值时会被忽略。但是,如果这个 32 位项被视为 32 位无符号整数,则该填充位对用户程序是可见的。 C 委员会被告知有一台机器以这种方式工作,这就是在 C99 中添加填充位的原因之一。
脚注 44 和 45 提到奇偶校验位可能是填充位。委员会不 知道任何具有整数内用户可访问奇偶校验位的机器。因此, 委员会不知道有任何机器将奇偶校验位视为填充位。
那么另一个问题是,C99提到的那台机器是什么?
编辑:似乎 C99 正在考虑取消对 1 的补码和有符号幅度的支持:http://www.open-std.org/jtc1/sc22/wg14/www/docs/n868.htmhttp://www.open-std.org/jtc1/sc22/wg14/www/docs/n873.htm(搜索 6.2.6.2)
【问题讨论】:
-
似乎是某种琐事问题。它是干什么用的?作业?
-
另外,我怀疑 C 委员会(故意)对人们更新遗留系统的编译器过于乐观。例如参见stackoverflow.com/questions/161797/…——我怀疑那里列出的 1s' 补码系统是否有积极维护的 C99 编译器,但我怀疑 C 委员会希望它可能即使它不太可能实际发生(因此不符合您规定的标准)。
-
我从未编写过这样的东西,但您应该寻找嵌入式处理器和其他特殊架构方面的奇怪之处。顺便说一句,您应该将
CHARBIT != 8列在您现在在现实世界中很少看到的事物列表中。 -
@Jens:
CHAR_BIT != 8太容易了,不过。有真正的现代 DSP 具有超大字节,因此很容易想象 C 委员会希望 C 在那里适用,而不编译器编写者需要鞭打“C”的表示指针”,它寻址比硬件的自然地址更小的单元。 -
我认为在您的愿望清单中,您忘记了一个使至少 3、6 变得微不足道的特殊情况:
_Bool。在无符号整数类型中明确提到了它。在许多架构上,CHAR_BIT-1高位是填充位,转换为该类型不会被截断。但这可能不是你想要的。