整形类型
整形类型:保存整数数值(范围限制),4个字节(一字节八位)存储数据,最大就是32位:(unsigned int 0~4294967295int -2147483648~2147483647):但是在php中默认是有符号类型(区分正负数)
在PHP中提供了四种整形的定义方式:十进制定义,二进制定义,八进制定义和十六进制定义:
十进制(正常数字) :逢10进1,能够出现的数字是0-9
二进制(以0b(0B)开头):逢2进1,能够出现的数字是0-1
八进制(以0开头):逢8进1,能够出现的数字是0-7
十六进制(以0x(0X)开头):逢16进1,能够出现的数字是0-9以及a-f,a表示10,以此类推
<?php
$a1 = 110; // 编译结果: 110
$a2 = 0b110; // 6
$a3 = 0110; // 72
$a4 = 0x110; // 272
echo $a1."\n".$a2."\n".$a3."\n".$a4; //默认php输出数据自动转化为10进制输出
?>
进制转换:手动转换
10进制转二进制:取出最大的2的N次方
10 --》8+2 --》 2^3 + 2^1 --》从二进制最右侧开始,第一个是2的0次幂,第二个是2的1次幂,以此类推,按照对应的指数次幂位置补1,没有的补0
00000000 00000000 00000000 00001010 1*2^3 + 0*2^2 + 1*2^1 + 0*2^0 = 10
二进制转10进制:从右侧开始,将对应的第几位作为2的指数,然后将所有的结果相加
00000000 00000000 00000000 00101011
00101011 --》 从右侧开始: 1*2^0+1*2^1+0*2^2+1*2^3+0*2^4+1*2^5 = 43
当然PHP中不需要用户这么复杂的去计算,提供了很多的函数进行转换
Decbin():十进制转二进制
Decoct(): 十进制转八进制
Dechex(): 十进制转十六进制
Bindec(): 二进制转十进制
<?php
var_dump(decbin(43)); // 编译结果:string(6) "101011"
var_dump(Bindec(101011)); // int(43)
?>
浮点类型
浮点型:小数类型以及超过整形所能存储范围的整数(不保证精度),精度范围大概在15个有效数字左右
浮点型定义有两种方式:
$f = 1.23;
$f = 1.23e10; //科学计数法,其中e表示底(10),相当于1.23*10^10
<?php
$f1 = 1.23; //编译结果:float(1.23)
$f2 = 1.23e10; // float(12300000000)
$f3 = PHP_INT_MAX+1; // float(2147483648)
var_dump($f1,$f2,$f3);//其中PHP_INT_MAX表示整形最大值,整形超过自身存储的大小之后会用浮点型存储
?>
简单说明浮点数为什么同样的字节数存储数据,但是却能表示更大的数据呢?
00000000 00000000 00000000 00000000 --》11111111 11111111 11111111 11111111(其中绿色1代表符号位,整形最大值,所有位数都是有效数据)
浮点数:红色表示符号位绿色7位算的结果是10的指数,后面三个字节存储表示具体数值
00000000 000000000 00000000 00000000 --》11111111 11111111 11111111 11111111
综上所述:尽量不要用浮点数做精确判断,浮点数保存的数据不够精确,而且在计算机中凡是小数基本上存的都不准确,如:
<?php
$f4 = 0.7; //编译结果:0.7
$f5 = 2.1; // 0.7
$f6 = $f5 /3; // bool(false)
echo $f6."\n".$f4."\n";
var_dump($f4 == $f6); //== 为比较运算符,false表示不相等
?>
布尔类型
布尔类型:两个值true和false,通常是用于判断比较
<?php
$b1 = true; //编译结果:bool(true)
$b2 = FALSE; // bool(false)
var_dump($b1,$b2);
?>
在进行某些数据判断的时候,需要特别注意类型转换(手册查看)
Empty():判断数据的值是否位"空",不是NULL,如果位空返回true,不为空返回false
isset():判断数据存储的变量本身是否存在,存在变量返回true,不存在返回false