【问题标题】:Is two's complementary representation universally platform-independent?两个的互补表示是否普遍独立于平台?
【发布时间】:2013-02-05 06:21:03
【问题描述】:

将一块内存初始化为零是惯用的

memset(p, 0, size_of_p);

当我们想将其初始化为负一时,我们可以:

memset(p, -1, size_of_p);

不管p是什么类型,因为在二进制的互补表示中,减一是8位整数为0xff,16位为0xffff,32位为0xffffffff。

我担心的是,这种两者的互补表示是否普遍适用于现代计算机领域?我可以期望这样的代码独立于平台并且足够健壮以移植到其他平台吗?

提前致谢。

【问题讨论】:

  • 你的问题标题和你的问题 body 是相关的,但有点不一致。您的标题似乎在询问按位二进制补语是否普遍等效(最好是,因为它只是对位序列的位操作)。但是您的问题主体属于负值的表示(特别是-1)以及 that 在覆盖类型的每字节级别上是否普遍独立于平台。它不是。所以你的问题标题的答案是yes;你的问题主体是no。 (无论如何我都读过它,但我认为阅读代码可能为时已晚)。
  • @WhozCraig 我改变了话题:D

标签: c memory language-lawyer twos-complement memset


【解决方案1】:

不,ISO C 标准允许三种表示负数的方案:

  • 二进制补码;
  • 个数的补码;和
  • 符号/大小。

但是,您应该记住,自从我看到使用这两种不太常见的方案的平台以来已经有 很长 时间了。我会说所有现代实现都使用二进制补码。

如果您想实现 100% 便携,您只需要关心这个问题。如果您是那种乐于 99.99999% 便携的人,请不要担心。


另请参阅 info on the ones' complement Unisys 2200(截至 2010 年仍然有效)和 this answer 解释布局。

【讨论】:

  • 在这种情况下,它实际上是肯定的。 :)
  • 如果我只想将一堆数字初始化为负数(所有有效值都是非负数),那么您提到的三种方案似乎都适用。我说的对吗?
  • @Kevin,请参阅我对 100 与 99.99999% 的评论。如果您想要额外的 0.00001% 覆盖率,则需要将每个单独的数组元素设置为 -1。但是你真的要为了Upper Wherevia的三台电脑而付出所有的努力吗? :-)
【解决方案2】:

简单的答案是肯定的,但更好的答案是您过早地进行优化。

编写显而易见的代码,而不是您认为快速的代码:

  for(i = 0; i < p; i++)
    array[i] = -1;

将由优化编译器自动转换为可能的最快表示形式(在 VS 中,当 p 足够大时它将成为 memset),它可以满足您的需求,而无需考虑这种过早的优化是否始终有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多