任务:总结归纳计算机编程中的各种数据类型,其表示形式和计算方法。重点关注类型转换、数值溢出和移位等操作。
一.C数据类型
- 整型(integer)
- 表示方法
int a; //整型(占用4个字节),最一般的整型数据说明方式
unsigned int a; //无符号整型(占用4个字节)
long int a; //长整型(占用4个字节)
unsigned long int a; //无符号长整型(占用4个字节)
short int a; //短整型(占用2个字节)
unsigned short int a; //无符号短整型(占用2个字节)
- 表示范围
- int 整型默认为有符号数,表示范围是 -32768~32767
- unsigned int 无符号整型,表示范围是0~65535
- long int 整型默认为有符号数,表示范围是-2147483648~2147483647
- unsigned long int 无符号长整型,表示范围是0~4294967295
- short int 默认为有符号数,表示范围是-32768~32767
- unsigned short int 无符号短整型,表示范围是0~65535
- 整型溢出
- 对于unsigned int来说,溢出后的数会以2^(8*sizeof(type))做模运算
- 对于signed int来说,溢出结果为实际计算结果
- 整型移位
无符号数的移位操作都是逻辑移位。
- 左移<<
二进制数按位向左移动,本质为×2.
有符号数最左端符号一出去时,发生移位溢出,数值符号可能改变。 - 右移>>
二进制数按位向右移动,本质为÷2.
有符号数符号位向右移动后,正数补0,负数补1。
- 字符型(character)
char a; //字符型(占用1个字节)
字符型数据内部表示是字符的ASCII码。
字符的ASCII码也可看作-128~127或0~255的一个整数。
3. 浮点型(floating-point)
/*浮点型又称实型,即实数类型*/
float a; //浮点型(单精度)(占用4个字节,小数点后有效位7位)
double a; //双精度型(双精度)(占用8个字节,小数点后有效位15位)
long double a; //(长双精度型)(占16个字节,小数点后有效位19位)
- 表示范围
float型数据的数值范围为-3.40E+38~3.40E+38
double型数据的数值范围为-1.79E+308~-1.79E+308
- 表示格式
程序中,书写浮点数的注意要点为:
- 整数部分和小数部分可任选,但不可以都没有
- 小数点和指数不能同时没有
- 指数部分是以一个字母e或E开头,后跟一个整数
- 浮点数溢出
- 浮点数上溢时,被赋予一个无穷大的值,printf函数显示的是inf。
- 指数部分已经达到最小值,计算机只好将尾数部分进行右移,空出首位的二进制数,丢弃最后一位的二进制数。
- 浮点数不支持移位操作
二.类型转换
隐式类型转换
隐式类型转换指的是不需要用户干预,编译器默认进行的类型转换行为。
隐式类型转换转换一般分为两种:内置数据类型、自定义数据类型。
内置数据类型最为常见。
例1:
/*混合类型的算数运算表达式中*/
int a=3;
double b=3.5;
double c=a+b=6.5;//在运算过程中,a会被自动转换为double类型,用转换的结果再和b相加
例2:
/*不同类型的赋值操作时*/
int a=true; //bool型被自动转换为int类型
bool a=5; //int型被自动转换为bool类型
例3:
/*函数参数传值时*/
void first(double a);
first(1); //调用函数时,int型整数1被自动转换为double类型
例4:
/*函数返回值时*/
double add(int a,int b)
{
return (a+b)
}; //运算结果会自动被转换为double类型后返回
总结:内置数据类型的隐式类型转换都满足一个原则:由低精度向高精度的转换。
显式类型转换
显式类型转换又称为强制类型转换。即人为的将某种类型转换为另一类型。
强制类型转换的转换符:()括号
例:
float a=3.5;
a=(int)a; //将a强制转换为int类型