当参数大小不同时,Objective-C如何处理位掩码?

时间:2015-04-18 17:22:19

标签: objective-c types type-conversion bitwise-operators integer-promotion

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

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

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

如果我用一个短大小的掩码对长片进行位掩码,显然我们只需选择感兴趣的位:

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

如果我用短的位掩码短片,

maskOut = shortVar & 0xFFFFFFF0;

似乎应该用零填充顶部,

0x0000BEEF & 0xFFFFFFF0  // == 0xBEE0

但保证会这样做,或者它可能是恰好位于记忆中的任何东西,更像是:

0x????BEEF & 0xFFFFFFF0  // == 0x????BEE0
显然,后者可能产生不明确的效果,是不可取的。

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

1 个答案:

答案 0 :(得分:2)

Objective-C是C的扩展。因此,行为与C. Google的“C标准草案”完全相同,并下载最新C标准的草稿副本(草稿是免费的,最终的标准成本大约60美元,但除非你以编写器为生,否则草案就好了。然后你寻找“整数促销”。

通常,只要您的值都是无符号的,通过填充零,可以将不同大小的操作数扩展为具有更大大小的操作数的大小。如果混合使用有符号值和无符号值,事情会变得复杂并且会引起麻烦。