当参数大小不同时,Objective-C 如何处理位掩码?
How does Objective-C handle bitmasking when arguments are not the same size?
在 Objective-C 中编码时,编译器在对两个不同大小的变量进行按位与运算(或执行其他按位运算)时应该做什么?
例如,假设我有如下一些变量:
unsigned long longVar = 0xDEADF00D;
unsigned short shortVar = 0xBEEF;
如果我用短掩码对长掩码进行位掩码,显然我们只会 select 出感兴趣的位:
maskOut = longVar & 0xFFFF; // this == 0xFOOD
如果我用长位掩码短位,
maskOut = shortVar & 0xFFFFFFF0;
看起来像这样应该用零填充顶部,
0x0000BEEF & 0xFFFFFFF0 // == 0xBEE0
但它是否保证会这样做,或者它是否可以是任何恰好存在于内存中的东西,更像是:
0x????BEEF & 0xFFFFFFF0 // == 0x????BEE0
显然,后者可能会产生未指明的效果,并且是不可取的。
我在清理的程序中发现了这种性质的代码,为了安全起见,我只是增加了类型的大小,但我想知道是否真的有必要。
Objective-C 是 C 的扩展。因此其行为与 C 完全相同。Google 对于 "C standard draft" 并下载最新 C 标准的草案副本(草稿是免费的,最终标准的费用约为 60 美元,但除非您以编写编译器为生,否则草稿就很好)。然后你寻找"integer promotions"。
一般来说,只要你的值都是无符号的,不同大小的操作数都会通过填充零来扩展到更大的操作数的大小。如果混合使用有符号和无符号的值,事情就会变得复杂,并且会引起头痛。
在 Objective-C 中编码时,编译器在对两个不同大小的变量进行按位与运算(或执行其他按位运算)时应该做什么?
例如,假设我有如下一些变量:
unsigned long longVar = 0xDEADF00D;
unsigned short shortVar = 0xBEEF;
如果我用短掩码对长掩码进行位掩码,显然我们只会 select 出感兴趣的位:
maskOut = longVar & 0xFFFF; // this == 0xFOOD
如果我用长位掩码短位,
maskOut = shortVar & 0xFFFFFFF0;
看起来像这样应该用零填充顶部,
0x0000BEEF & 0xFFFFFFF0 // == 0xBEE0
但它是否保证会这样做,或者它是否可以是任何恰好存在于内存中的东西,更像是:
0x????BEEF & 0xFFFFFFF0 // == 0x????BEE0
显然,后者可能会产生未指明的效果,并且是不可取的。
我在清理的程序中发现了这种性质的代码,为了安全起见,我只是增加了类型的大小,但我想知道是否真的有必要。
Objective-C 是 C 的扩展。因此其行为与 C 完全相同。Google 对于 "C standard draft" 并下载最新 C 标准的草案副本(草稿是免费的,最终标准的费用约为 60 美元,但除非您以编写编译器为生,否则草稿就很好)。然后你寻找"integer promotions"。
一般来说,只要你的值都是无符号的,不同大小的操作数都会通过填充零来扩展到更大的操作数的大小。如果混合使用有符号和无符号的值,事情就会变得复杂,并且会引起头痛。