初识C语言,分享个中小细节(细品~)

mac2026-08-28  6

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;
最新回复(0)