2048转换为BOOL返回0

时间:2014-05-13 12:19:21

标签: ios objective-c c boolean

考虑这段代码

NSInteger q = 2048;
BOOL boolQ = q;

NSLog(@"%hhd",boolQ);

执行后boolQ等于0.有人可以解释为什么会这样吗?

2 个答案:

答案 0 :(得分:3)

BOOL可能实现为charuint8_t / int8_t,因为"hh"打印整数的一半的一半。通常是一个字节。

转换为char2048(= 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提出的!!成语;也许违反直觉,您可以通过而不是转换值来显式转换值(相反,转换由!运算符插入的隐式转换操作正确处理)。