5

最近我被这个问题弄糊涂了。也许是因为我没有阅读语言规范(这是我的错,我知道)。

C99 标准没有说明编译器应该使用哪种负数表示。我一直认为存储负数的唯一正确方法是二进制补码(在大多数情况下)。

所以这是我的问题:你知道任何现代编译器默认实现一个补码或符号幅度表示吗?我们可以用一些编译器标志来改变默认表示吗?

确定使用哪种表示的最简单方法是什么?

那么 C++ 标准呢?

4

3 回答 3

5

我认为这不是编译器使用什么表示的问题,而是底层机器使用什么表示的问题。编译器选择目标机器不支持的表示是非常愚蠢的,因为这会引入大量开销而没有任何好处。

IP 协议套件中的某些校验和字段使用反码,因此也许专用的“网络加速器”型 CPU:s 实现它。

于 2009-04-01T10:25:27.787 回答
1

虽然二进制补码表示是迄今为止最常见的,但它并不是唯一的(见一些)。C 和 C++ 标准化委员会不想要求非二进制补码机器模拟非本地表示。因此,C 和 C++ 都不需要特定的负整数格式。

这导致对有符号类型的按位运算的未定义行为。

于 2009-04-01T10:52:59.810 回答
1

实现补码数学的UNISYS 2200 系列仍在与一些相当更新的编译器一起使用。您可以在以下问题中了解更多信息

于 2015-05-14T04:42:44.087 回答