【问题标题】:Compilers and negative numbers representations编译器和负数表示
【发布时间】:2010-10-16 20:03:59
【问题描述】:

最近被this question搞糊涂了。可能是因为我没有阅读语言规范(这是我的错,我知道)。

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

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

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

C++ 标准呢?

【问题讨论】:

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


【解决方案1】:

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

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

【讨论】:

  • 是否有适用于“网络加速器”型 CPU 的 C 编译器?
  • @klew:我在谷歌搜索几分钟后找不到,但这并不能证明太多。 :)
【解决方案2】:

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

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

【讨论】:

  • 是的,但这不是我要问的。你知道默认情况下会使用非二进制补全的任何 C 编译器吗?
  • 那些使用非拖链补码的系统...显然,其中包括一些仍受支持的 Unisys 盒子(这可能在第二个链接中列出)。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    相关资源
    最近更新 更多