编译器和负数表示

时间:2009-04-01 10:19:35

标签: c++ c compiler-construction representation negative-number

最近我对this question感到困惑。也许是因为我没有阅读语言规范(这是我的错,我知道)。

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

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

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

那么C ++标准呢?

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

虽然twos-complement表示是最常见的,但它不是唯一的(see some)。 C和C ++标准化委员会不希望要求非二进制补充机器模拟非本地表示。因此C和C ++都不需要特定的负整数格式。

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

答案 2 :(得分:1)

实现一个补码数学的UNISYS 2200 series仍在使用中。您可以在下面的问题中阅读更多相关信息

Exotic architectures the standards committees care about

Are there any non-twos-complement implementations of C?