在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
显然,后者可能产生不明确的效果,是不可取的。
我在清理的程序中找到了这种性质的代码,我只是增加了类型的大小以确保安全,但我想知道它是否真的有必要。
答案 0 :(得分:2)
Objective-C是C的扩展。因此,行为与C. Google的“C标准草案”完全相同,并下载最新C标准的草稿副本(草稿是免费的,最终的标准成本大约60美元,但除非你以编写器为生,否则草案就好了。然后你寻找“整数促销”。
通常,只要您的值都是无符号的,通过填充零,可以将不同大小的操作数扩展为具有更大大小的操作数的大小。如果混合使用有符号值和无符号值,事情会变得复杂并且会引起麻烦。