我最近遇到了一个非常难以重现的错误。如果由于某种原因我向BOOL转换了一个不是nil的指针我得到NO !!! 11我知道BOOL是带有signed char的typedef。这可能是个问题吗?
答案 0 :(得分:4)
因为指针是32位大而char只是8位。因此,当从指针转换为char时,它将修剪24位。因此,剩余的8位只是零的可能性非常高,特别是当指针地址很高时。
您可以做的是:
BOOL myBool = (myPointer != NULL); // This will evaluate if the pointer is true (>0) or false (NULL)
答案 1 :(得分:4)
如果指针的格式为0xNNNNNN00
或(在64位上)0xNNNNNNNNNNNNNN00
,其中N
是任何十六进制数字,则转换为BOOL
( unsigned char
)会留下0
,因为它会截断所有非零位。
要将指针正确转换为BOOL
,请使用不等式运算符:
BOOL isNotNull = (myPointer != NULL);
答案 2 :(得分:1)
BOOL
不是应该使用的类型。事实上,我可以想到一个布尔类型的变量很少使用(而不是只使用它所基于的原始值,指针或其他任何东西),除非在巨型位数组的情况下你需要特殊的代码来解决它位。如果你真的想要一个布尔类型,请使用C99 _Bool
(或bool
中的stdbool.h
),它具有正确的转换语义而不是模256减少。