4

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

memset(p, 0, size_of_p);

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

memset(p, -1, size_of_p);

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

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

提前致谢。

4

2 回答 2

4

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

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

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

如果您想 100% 便携,您只需要关心这一点。如果您是那种乐于 99.99999% 便携的人,请不要担心。


另请参阅有关补充 Unisys 2200 的信息(在 2010 年仍然有效)和解释布局的这个答案。

于 2013-02-05T06:29:14.560 回答
3

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

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

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

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

于 2013-02-05T06:29:19.357 回答