- 数据压缩·课前任务一
总结归纳计算机编程中各种数据类型,包括其表示形式和计算方法(即如何求每种数据类型的取值范围),重点关注类型转换、数值溢出和移位等操作。
由于该课程使用C语言,便以C语言为例,实际上不同变成语言的数据类型和表示形式等会存在一定区别
·C中各种数据类型的表示形式和取值范围
-各数据类型取值范围的计算方法:
整型、字符型:
有符号型:-2^(x-1) ~ 2^(x-1)-1
无符号型: 0~2^(x)-1
( x为该数据类型的位数,与系统的位数有关,1字节=8位)
浮点型:注意取值范围的下界与和float的最小值不是一回事。
float 最小值: 1.175494e-38
float 最大值: 3.402823e+38
参考资料link.
//可用该程序输出浮点型占用的存储空间及它的最大最小值
#include <stdio.h>
#include <float.h> //注意这个头文件
int main()
{
printf("float 存储最大字节数 : %lu \n", sizeof(float));
printf("float 最小值: %E\n", FLT_MIN );//%E 为以指数形式输出单、双精度实数
printf("float 最大值: %E\n", FLT_MAX );
printf("精度值: %d\n", FLT_DIG );
return 0;
}
//编译并执行上面的程序时,它会产生下列结果:
float 存储最大字节数 : 4
float 最小值: 1.175494E-38
float 最大值: 3.402823E+38
精度值: 6
·类型转换
若一个表达式中含有不同类型的常量和变量,在计算时,会将它们自动转换为同一种类型;也可以对数据类型进行强制转换;
- 自动转换规则:浮点数赋给整型,该浮点数小数被舍去;整数赋给浮点型,数值不变,但是被存储到相应的浮点型变量中.
- 强制类型转换形式: (类型说明符)(表达式).
//举例
#include<stdio.h>
int main()
{
float f,g,x=3.6,y=5.4;
int i=4,a,b;
a=x+y;
b=(int)(x+y);
f=10/i;
g=10.0/i;
printf("a=%d,\nb=%d,\nf=%f,\ng=%f,\nx=%f",a,b,f,g,x);
return 0;
}
//编译并执行上面的程序时,它会产生下列结果:
a=9,
b=9,
f=2.000000,
g=2.500000,
x=3.600000
·数值溢出
- 整型溢出
整数的溢出,当达到最大值时,将会溢出到起始点;当达到最小值时,将会从最大点开始往变小方向溢出。
- 无符号整型溢出:
溢出后的数会以2^(8*sizeof(type))作模运算,也就是说,如果一个unsigned char(1字符,8bits)溢出了,会把溢出的值与256求模。如:
#include<stdio.h>
int main()
{
unsigned char x = 255;
printf("%d", ++x);
return 0;
}
//上面的代码会输出:0 (因为255 + 1=256,与2^8求模后就是0)
- 有符号整型溢出:
C的规范定义是“undefined behavior”,也就是说,编译器爱怎么实现就怎么实现。如:
#include<stdio.h>
int main()
{
signed char x =127;
printf("%d", ++x);
return 0;
}
//上面的代码会输出:-128,因为127 + 1=128,也就是二进制的1000 0000,符号位为1,负数,后面为全0,就是负的最小数,即-128。
- 浮点型溢出
浮点数上溢时,被赋予一个无穷大的值,printf函数显示的是inf。
·移位操作
整型、字符型移位:逻辑移位。
左移<<
二进制数按位向左移动,丢弃最高位,低位补0,即十进制数乘2。
右移>>
二进制数按位向右移动,即十进制数除以2;
对于有符号数,正数补0,负数补1。
左移和右移运算过程中也会发生溢出,移位位数并不是可以任意。当移位位数超过该数值类型的最大位数时,编译器会用移位位数去模该类型位数,然后按照余数进行移位。
int main()
{
int i=1;
//char i=1;
i=i<<33;
printf("%d\n",i);
return 0;
}
结果:2
//左移位数为33,变量i为32位,故左移位数实际为:33%32=1,结果为2
浮点数不能进行移位操作。