考虑这段代码
NSInteger q = 2048;
BOOL boolQ = q;
NSLog(@"%hhd",boolQ);
执行后boolQ等于0.有人可以解释为什么会这样吗?
答案 0 :(得分:3)
BOOL可能实现为char
或uint8_t
/ int8_t
,因为"hh"
打印整数的一半的一半。通常是一个字节。
转换为char
取2048
(= 0x800
)的最低8位,并为您提供0
。
将任何整数转换为布尔值的正确方法是:
NSInteger q = some-value;
BOOL b = !!q;
答案 1 :(得分:0)
将一个整数值转换为太小而无法表示转换值的类型是C(C11标准附件J.2)中的未定义行为,因此也是Objective-C中处理C级事务的部分。由于它是未定义的行为,它可以表示它想要的结果,预期值或不是。
根据6.3.1.4,任何整数都可以用作为一个布尔值而不进行强制转换,在这种情况下它会显示预期的行为(0为0,其他一切都为1),从而产生由alk提出的!!
成语;也许违反直觉,您可以通过而不是转换值来显式转换值(相反,转换由!
运算符插入的隐式转换操作正确处理)。