在iOS上,默认情况下,char是有符号的还是无符号的?

8

char在iOS上默认是有符号的还是无符号的?

(我认为这应该是一个常见的问题,但很奇怪地,谷歌没有提供任何有用的信息!)

2个回答

14

在大多数情况下,char在ARM上是无符号的(出于性能原因),而在其他平台上是有符号的。

iOS与ARM的正常惯例不同,默认情况下char是带符号的。 (特别是与Android不同,在ndk中编译的代码默认为无符号字符。)

这可以在Xcode中更改,有一个名为'char' Type is unsigned的选项(默认为关闭)。如果将其更改为“是”,Xcode将传递-funsigned-char给LLVM。(在Xcode 5.0.2上进行了检查)

iOS为什么不同,在iOS ABI函数调用指南: ARM64函数调用约定中提到了原因,其中简单地说明:

在iOS中,与其他达尔文平台一样,charwchar_t都是带符号类型。


1
我不知道ARM工具链默认为“unsigned char”! :o 谢谢分享这个信息! - user529758
1
ARM EABI将char定义为无符号类型;这就是为什么常规工具链这样做的原因。EABI做了很多愚蠢的事情,但它是ARM的“标准”,而在EABI出现之前存在的不兼容ABI混合体,每个都有自己的瑕疵,可能比我们现在被困在其中的EABI更糟糕。 - R.. GitHub STOP HELPING ICE
3
在EABI中 char 类型为无符号的主要原因是,无符号的 char 类型在ARM处理器上可以更快地执行代码,因为ARM的字节级加载和存储指令使用无符号值(不进行符号扩展)。 - ouah
2
@ouah 说实话,我认为默认使用无符号字符更合乎逻辑,因为 char 经常用于二进制字节操作和字符串中表示字符。 - user529758
1
@ouah 不,EABI中的char是无符号的,因为早期的ARM CPU没有ldrs,这需要CPU首先将值作为无符号加载,然后通过旋转进行符号扩展。自从引入了ldrs以来,有符号和无符号字符的加载/存储性能相同。 - sgupta
显示剩余10条评论

1

为什么你不尝试一下呢?

char x,y;

x=y=0x7F;
x++;
if(x>y) unsigned else signed...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接