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

sli*_*eed 2 macos objective-c ios

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

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

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

Lil*_*ard 5

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

E1 >> E2的结果是E1右移E2位位置.如果E1具有无符号类型或者E1具有有符号类型和非负值,则结果的值是E1/2 ^ E2的商的整数部分.如果E1具有带符号类型和负值,则结果值是实现定义的.

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

  • @Kevin - 他们绝对不必对未定义的行为做出选择.例如,如果你使用`>>`,它将*总是*是符号扩展或总是*不*是符号扩展(好吧,对于两个补码,无论如何),而如果你做`p = p ++ `,你每次都可以得到不同的答案.未定义的行为和实现定义的行为之间存在非常明显的区别. (2认同)