在 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
显然,后者可能会产生未指定的效果,并且是不可取的。
我在正在清理的程序中发现了这种性质的代码,我只是增加了类型的大小以确保安全,但我想知道它是否真的有必要。