OSX / iOS上的Objective C中的右移运算符是算术或逻辑右移吗?
我找不到任何引用来指定右移是算术还是逻辑,或者它是否根据数据类型(有符号/无符号)和/或体系结构(x86 / PPC / x64 / ARM)而变化。
“Objective-C 2.0编程”指出这实际上是未定义的,但这与我在别处看到的信息冲突,编译器试图根据类型的签名来“做正确的事情”。
答案 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
...
这似乎表明这种转变是算术的,而不是逻辑的,因为答案的符号得以保留。