float类型与int类型同样是4个字节为何表示范围会有这么大差距?
float类型有4个字节(32个二进制位)其中有1个符号位,8个指数位,23个尾数位。
以数字3.5为例:
3.5的二进制数为:0011.1000 ,可将其表示为1.11*2^1。
因此浮点数可以表示为1.xxxxxx*2^n(x为任意值)。
所以float类型可以表示的最大值为:
[1+(1-2^23)]*2^127=2^128-2^104
最小值为:-(2^128-2^104)
所以差距会比较大。
常量表示的错误形式!
整数常量:
八进制:088 //错误!
浮点常量:
3f //错误! 必须是小数才能加f
e18 //错误! 科学计数法前面必须有数值
3.1e3.2 //错误! 科学计数的指数不能为小数
操作符的一些隐藏小细节(只包含个别操作符)
1.算术加:int+int 结果为int类型 (注意数据溢出)
2.算术除:int/int 结果也为int类型 (除数不能为0,但可以是0.0)
3.取余 : 取余两边的操作数都必须是整数,不能是浮点数,任何数据不能对0取余
4.逻辑运算符之短路特性:&&连接的两个表达式,如果前面的表达式为假,则后面的
表达式无需计算;||连接的两个表达式,如果前面的表达式为真,则后面的表达式
无需计算。(&&的优先级高于||)
5.位运算: 按位与推论:num&-1=-1;num&0=0;
按位或推论:num|-1=-1;num|0=num;
按位异或推论:num^num=0;num^1=~num=-(num+1)
按位取反推论:~num=-(num+1);
6.按位右移:右边移出的位舍弃,左边空出的位补符号位;每向右移一位相当于除以2
向右移位的位数仅限于[0,31],超过32位会对32求余。
7.向左移位:左边移出的位舍弃,右边空出的位补0,相当于乘以2。
你可能不知道的小知识1.0
1.整数字面值如果是在区间[-2^31,2^31-1]之间的话,默认为int类型。
int类型数据运算得到的结果也是int类型
2.不同的数据类型进行运算,低字节的数会隐式转为高字节的数。
对于有符号位的扩充符号位,无符号位的扩充0。
3.unsigned和signed进行计算时,会把signed数据转换为unsigned。
举个例子:
int a = -16 ;
unsigned b = 10 ;
if(a+b>=0){//恒成立
}
4.运算符的优先级:
算术运算符>位运算符(~除外)
算术运算符>关系运算符>逻辑运算符
5.交换两个数的值可以用异或:
a=a^b;
b=a^b;
a=a^b;
sizeof的陷阱集合篇
1.sizeof是操作符!!(不是函数);
2.操作数如果是类型必须加上();
3.sizeof只关心表达式的结果,并不会计算表达式的值;
4.sizeof(expr) expr是一个多类型表达式时,只关心最宽的字节类型;
5.sizeof(函数名)函数名没有小括号,结果始终为1;
6.sizeof(函数名())函数名有小括号,结果等于函数返回值类型字节宽度;
7.sizeof(指针) 结果始终为4;