在OSX / iOS上的Objective C中的右移运算符是算术或逻辑右移吗?

时间:2011-09-09 23:06:38

标签: objective-c ios macos

OSX / iOS上的Objective C中的右移运算符是算术或逻辑右移吗?

我找不到任何引用来指定右移是算术还是逻辑,或者它是否根据数据类型(有符号/无符号)和/或体系结构(x86 / PPC / x64 / ARM)而变化。

“Objective-C 2.0编程”指出这实际上是未定义的,但这与我在别处看到的信息冲突,编译器试图根据类型的签名来“做正确的事情”。

2 个答案:

答案 0 :(得分:5)

Objective-C没有定义右移运算符的行为。该运算符在C中定义。这是ANSI C规范的相关部分:

  

E1>>的结果E2 是E1右移 E2 位位置。如果 E1 具有无符号类型或 E1 具有有符号类型和非负值,则结果的值是 E1 /的商的不可分割部分2 ^ E2 即可。如果 E1 具有签名类型和负值,则结果值是实现定义的。

所以是的,负数的右移运算符是根据规范实现定义的。

答案 1 :(得分:3)

我在iOS模拟器中进行了快速实验,其中包含以下片段:

int i = -600;

for (int j = 0; j < 68; j++)
{
    NSLog(@"j: %d i: %d", j, i);
    i = i >> 1;
}

产生了结果:

  

j:0 i:-600

     

j:1 i:-300

     

j:2 i:-150

     

j:3 i:-75

     

j:4我:-38

     

j:5 i:-19

     

j:6 i:-10

     

j:7 i:-5

     

j:8 i:-3

     

j:9 i:-2

     

j:10 i:-1

     

j:11 i:-1

     

...

这似乎表明这种转变是算术的,而不是逻辑的,因为答案的符号得以保留。