1

在 Objective-C 中编码时,编译器在对两个不同大小的变量进行按位与(或执行其他按位运算)时应该怎么做?

例如,假设我有一些变量如下:

unsigned long longVar   = 0xDEADF00D;
unsigned short shortVar = 0xBEEF;

如果我用一个短尺寸的掩码对长进行位掩码,显然我们只会选择感兴趣的位:

maskOut = longVar & 0xFFFF;    // this == 0xFOOD

如果我用长位掩码短,

maskOut = shortVar & 0xFFFFFFF0;

看起来这应该用零填充顶部,

0x0000BEEF & 0xFFFFFFF0  // == 0xBEE0

但它是否保证会这样做,或者它可能是任何碰巧在内存中的东西,更像是:

0x????BEEF & 0xFFFFFFF0  // == 0x????BEE0

显然,后者可能会产生未指定的效果,并且是不可取的。

我在正在清理的程序中发现了这种性质的代码,我只是增加了类型的大小以确保安全,但我想知道它是否真的有必要。

4

1 回答 1

2

Objective-C 是 C 的扩展。因此行为与 C 完全相同。谷歌“C 标准草案”并下载最新 C 标准的草案副本(草案是免费的,最终标准的成本约为60 美元,但草稿还不错,除非你以编写编译器为生)。然后你寻找“整数促销”。

一般来说,只要你的值都是无符号的,不同大小的操作数通过填充零扩展到更大大小的操作数的大小。如果您混合有符号和无符号值,事情会变得复杂并可能导致头痛。

于 2015-04-18T17:28:55.430 回答