OC的BOOL类型

OC的BOOL类型:

32-bit下,BOOL被定义为signed char.
64-bit下,BOOL被定义为bool.

BOOL类型有两个值YES,NO。YES=1,NO=0。

说明:objective-c 中的BOOL 实际上是一种对带符号的字符类型(signed char)的类型定义(typedef),它使用8位的存储空间。通过#define指令把YES定义为1,NO定义为0。

注意:objective-c 并不会将BOOL作为仅能保存YES或NO值的真正布尔类型来处理。编译器仍将BOOL认作8位二进制数,YES 和 NO 值只是在习惯上的一种理解。

 

问题:如果不小心将一个大于1字节的整型值(比如short或int)赋给一个BOOL变量,那么只有低位字节会用作BOOL值。如果该低位字节刚好为0(比如8960,写成十六进制为0x2300),BOOL值将会被认作是0,即NO值。而对于bool类型,只有true和false的区别,即0 为false,非0为true。bool类型变量就当变量的值是非0就返回1,等于0就返回0.

 

举例:

BOOL  b1=8960;  // 实际是 NO,因为8960换成十六进制为0x2300,BOOL 只有8位存储空间,取0x2300的低8位,00,所以是NO

bool  b2=8960;//实际是true,因为bool类型,非0即为true。

 

测试:

BOOL j = 8960;

NSLog(@"j:%d",j);//2015-01-28 22:40:29.935 地址作为参数的函数[3468:251458] j:0

bool m = 8960;

NSLog(@"m:%d",m);//2015-01-28 22:40:29.935 地址作为参数的函数[3468:251458] m:1

 

相关知识:

①机器字长:是指计算机进行一次整数运算所能处理的二进制数据的位数(整数运算即定点整数运算)。通常也是CPU内部数据通路的宽度。即字长越长,数的表示范围也越大,精度也越高。机器的字长也会影响机器的运算速度。倘若CPU字长较短,又要运算位数较多的数据,那么需要经过两次或多次的运算才能完成,这样势必影响整机的运行速度。机器字长与主存储器字长通常是相同的,但也可以不同。不同的情况下,一般是主存储器字长小于机器字长,例如机器字长是32位,主存储器字长可以是32位,也可以是16位,当然,两者都会影响CPU的工作效率。

②在计算机系统中,数值一律用补码来表示和存储。

③原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。表示方式有很多8位二进制原码等。因此脱离表示方式讲一个数的原码就是耍流氓。另外,补码的补码就是原码。

eg(用8位二进制表示法),5 :0000 0101。 28 :0001 1100。 -13 :1000 1101

反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。

补码表示方式很多,有8位二进制补码表示形式、16位二进制补码表示形式,以及32位二进制补码表示形式,64位进制补码表示形式等。每一种补码表示形式都只能表示有限的数字。

④补码与原码的相互转换。
已知一个数的补码,求原码的操作其实就是对该补码再求补码:
⑴如果补码的符号位为“0”,表示是一个正数,其原码就是补码。

⑵如果补码的符号位为“1”,表示是一个负数,那么求给定的这个补码的补码就是要求的原码。

【例】已知一个补码为11111001,则原码是10000111(-7)。

因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”。
其余七位1111001取反后为0000110;
再加1,所以是10000111。

 

于是:

BOOL l = 130; //130的16位二进制原码是:0000 0000 1000 0010。由于在计算机中,数值是以补码的形式存储的。因此要把原码转换成补码。由正数的转换规则得知其补码为:0000 0000 1000 0010。用BOOL类型来装这个数的话。由于BOOL是有符号字符型即只占8位,于是从最后一位起截取8位得到:1000 0010。转换成原码并用十进制打印出来就变成了-126. 转换过程(由于是有符号字符型,因此最高位代表符号位,故最高位保持不变,其余位取反后加1): 1111 1101 + 1 = 1111 1110 -- -126

NSLog(@"l:%d",l);//2015-01-28 22:15:11.249 地址作为参数的函数[3440:242113] l:-126

BOOL k = -130;//1000 0000 1000 0010转成补码1111 1111 0111 1110,再截取8位变成0111 1110,由于是有符号的,因此最高位代表符号位,0代表是正数,有规定可知,正数的原码就是补码,正数的补码就是原码。从而得到其原码为:0111 1110,转换成十进制就是126。

NSLog(@"k:%d",k);//2015-01-28 22:15:11.249 地址作为参数的函数[3440:242113] k:126

 

 

posted @ 2015-04-11 20:33  xq_120  阅读(3118)  评论(0编辑  收藏  举报