Objective c 为什么布尔是有符号字符?

Objective c 为什么布尔是有符号字符?,objective-c,Objective C,前几天,一位用户向我报告了一个关于工具栏项目的错误,该项目在应该启用时被禁用。验证代码(为了您的利益而简化)如下所示: - (BOOL) validateToolbarItem: (NSToolbarItem *) toolbarItem { NSArray* someArray = /* arrray from somewhere*/ return [someArray count]; } 我花了几分钟才意识到-count返回一个32位无符号int,而BOOL是一个8位有

前几天,一位用户向我报告了一个关于工具栏项目的错误,该项目在应该启用时被禁用。验证代码(为了您的利益而简化)如下所示:

- (BOOL) validateToolbarItem: (NSToolbarItem *) toolbarItem {

    NSArray* someArray = /* arrray from somewhere*/

    return [someArray count];
}
我花了几分钟才意识到-count返回一个32位无符号int,而BOOL是一个8位有符号字符。碰巧在这个例子中,某个数组中有768个元素,这意味着低8位都是0。当int在返回时被转换为BOOL时,它将解析为
,即使人类希望答案是


此后,我将代码更改为
return[someArray count]>0它更小,就是这样。

一个明显的答案是它比int小四倍(在典型的32位和64位体系结构上),并且没有任何对齐要求

布尔值只需要一个位(0或1),但标准系统将字节作为最小单位处理。以字节表示的bool(8位)比32位整数小4倍,因此字节大于整数的动机。

bool有助于节省一位空间并将值限制为0或1。它是一种较小的类型,原因与您可能在双精度上使用浮点或在长精度上使用短精度相同。只是空间问题


这就是为什么显式转换是一个好主意,对于布尔值,在相同类型的两个之间执行实际逻辑比较,以获得实际布尔值而不是截断值。

回到更简单的时间

BOOL类型是在CPU自然使用8位类型时创建的,很少填充到16位或32位。然而,内存是稀缺的,将1位塞进4字节实际上会消耗大量额外内存

注意到BoL很可能在C++的BooL之前有相当长的时间(Irr-它们可能是同一个年龄。当下一个选择Objul-C,C++是相同的流行度)。(至今)关注的是为什么BoL不是int。答案很明显:字符小于int,当Objy-C设计回到80年代时,减少几个字节总是好的

但您的问题似乎也在问,“为什么布尔是有符号的而不是无符号的?”为此,我们可以在
/usr/include/objc/objc.h
中查看布尔的类型定义:

typedef signed char     BOOL; 
// BOOL is explicitly signed so @encode(BOOL) == "c" rather than "C" 
// even if -funsigned-char is used.
所以有一个答案:Objective-C设计人员不想将def BOOL键入char,因为在某些系统上,在某些编译器下(记住Objective-C早于ANSI C,所以C编译器不同),char是有符号的,而在某些编译器下是无符号的。设计者希望
@encode(BOOL)
跨平台返回一致的值,因此他们在typedef中包含了签名


但这仍然回避了一个问题:为什么要签名而不是不签名?我没有一个明确的答案;我想原因是他们不得不选择一个或另一个,并决定与签署。如果我不得不进一步猜测的话,我会说这是因为int是默认有符号的(也就是说,如果它们不包含有符号限定符)。

你会经常看到
!![someArray count]
正是出于这个原因(与
>0的作用几乎相同)如果你再仔细思考一下你的问题,你会发现它相当于“为什么任何类型都与int不同?”因为答案几乎相同。存在较小的标量类型,因为它们不需要int的完整范围。BOOL甚至不需要有符号字符的完整范围,但没有较小的类型可用。您确实不应该将布尔表达式的结果以外的任何内容分配给布尔变量,无论使用什么实际类型来实现布尔变量。去检查一下你的代码,看看有没有像这样的讨厌的东西。讽刺的是,在大多数编译器/架构上,它会填充掉其他3个字节,这样它就可以写更快的32位读取/writes@Paul:我从未在structs中见过任何编译器pad
char
-你能举个例子吗?由于连续存储需求,它肯定不会在数组中执行此操作;sizeof(x)==12。这可能就是他的意思。@sharth:这种情况下的填充是对齐
c
,具体来说与
b
的类型没有多大关系。我会看看是否可以通过kd找到一个示例,不过我可能已经有很多了。你绝对是对的wrt数组。如果场景后面没有逻辑,那么这不是一个合乎逻辑的决定。没有回答?这在正规科学中很糟糕。随机性不应适用于设计决策。特别是在设计正式语言时。道德?不知道但是,怀疑O-C是否是一种有价值的语言似乎是合理的。@cedbeu:你为什么说没有逻辑?关于为什么
BOOL
是某种类型的
char
,有很多逻辑。唯一不清楚的是为什么它是有符号的而不是无符号的,在这种情况下,两者都是相当随意的(这意味着你必须选择一个,但选择哪一个不是什么大问题)。只是,我不喜欢这个主意。我倾向于认为,如果你不得不做出一个——甚至是很小的——武断的决定,这意味着核心设计中存在一些缺陷。但你是对的,这可能没什么大不了的,而且在每种语言(brrr)的某一点上都可能有如此武断的设计决策。