1.整型变量类型
char 1主要用于存储字符的整数代码
short (short int) 2
int 4
long (long int) 8
short int bean_count=0;
short bean_count=0;
long int earth =12345678L;
带符号和不带符号的整数类型
不带符号类型:
unsigned short int
unsigned int
unsigned long int
带符号和不带符号 的char类型
存储类型为char的值可以是带符号的,也可以是不带符号的,这取决于编译器如何实现它。
如果用一个字节存储整数值,而不是存储字符编码,就应把变量的类型显式声明wieldsingned char 或unsigned char.
整型变量取值范围
char | -2^7 ~ +2^7-1 |
unsigned char | 0~2^8-1 |
short | |
unsigned short | |
int | |
unsigned int | |
long | |
unsigned long |
整型数值的前缀和后缀
没有前缀 | 十进制 |
前缀为0x或0X | 十六进制 |
前缀为0 | 8进制 |
后缀为u或 U | 不带符号的类型 |
后缀为l或L | long类型 |
整型字面量与前后缀
字面量十进制整型没有前缀,其值在int范围内,解释为int类型。否则为long类型。
字面量后缀有u或U,其值在unsigned int取值范围内,就解释为unsigned int,否则解释为unsigned long。
字面量八进制和十六进制如果没有后缀,则解释为int、unsigned int、long、unsigned long。
字面量后缀带有l或L,其值位于long 取值范围内,则解释为long,否则解释为unsigned long。
不能将整型字面量指定为short或unsigned short int类型。
在变量的声明中提供这些类型的初始值时,编译器会自动把字面量的值转换为需要的类型。
2.浮点数
参考:http://www.linuxidc.com/Linux/2012-07/65986.htm
参考:http://www.linuxidc.com/Linux/2012-07/65987.htm
对编程人员来说,double 和 float 的区别是double精度高,有效数字16位,float精度7位。
但double消耗内存是float的两倍,double的运算速度比float慢得多,C语言中数学函数名称double 和 float不同,
不要写错,能用单精度时不要用双精度(以省内存,加快运算速度)。
long double标准是规定它是128位浮点数据的,而double是64位浮点数据,但是编译器不一样也有差别,
比如vc中它们都是64位的。总之long double >= double =64位是不会错的。
浮点数字面量有三种基本形式:
1)小数形式,110.0
2)指数形式,11E1或 11e1:11*10^1 (=110.0)
3)使用小数点和指数,1.1E2 (=110.0)
数符占1位二进制,表示数的正负。
指数符占1位二进制,表示指数的正负。
尾数表示浮点数有效数字, 0.xxxxxxx,但不存开头的0和点
指数存指数的有效数字
数据类型 | 说明 | 长度 | 符号位(Sign) | 阶码(Exponent) 采用移位存储方式 | 尾数(Mantissa) |
float | 单精度 | 32bit(4Byte) | 1 | 8 | 23 |
double | 双精度 | 64bit(8Byte) | 1 | 11 | 52 |
long double | 扩展的双精度 | 128bit | 1 |
其中,因为最高位的1,由于任何的一个数表示成这种形式时这里都是1,
所以在存储时实际上并不保存这一位,这使得float的23bit的尾数可以表示24bit的精度,double中52bit的尾数可以表达53bit的精度。
数据类型 | 表达精度 | 实际表达精度(多一个前面的1.) |
float | 23 | 23+1=24 |
double | 52 | 52+1=53 |
long double |
十进制中的9,在二进制中的表示形式是1001,这里也就告诉我们,表示十进制中的一位数在二进制中需要4bit,
所以我们现在float中具有24bit的精度,所以float在十进制中具有 24/4=6,
所以在十进制里,float能够精确到小数点后6位。
同理,具有53bit精度的double类型能够精确到小数点后13位。
但是在计算机中,计算机只认识0和1,所以在计算机中是按照科学计算的二进制的方式表示的:
9 的二进制表示为 1001
0.125 的二进制表示为 0.001
所以9.125的表示成1001.001
将其表示成二进制的科学计数方式为 1.001001 * 2^3
在存储指数时数据的基数是127,而不是0。
例如上面的9.125,其二进制的指数部分为3,
所以在存储时实际上存的是127+3=130。(130的二进制表示为10000010)
Sign | Exponent(符号位1bit + 7bit) | Mantissa |
1bit | 8bit | 23bit |
1 | 10000010 | 0010010 00000000 00000000 |
实际上在X86计算机中,采用的是小端存储方式,即低地址存储低位数据,高地址存储高位数据。
所以数据应该是这样存储的:
double db=1.1E-5;
cout <<++db<<endl;//1.00001
db+=1;
cout <<db<<endl;//2.00001
float value1=0.1f;
float value2=2.1f;
value1-=0.09f;
value2-=2.09f;
cout <<value1<<endl;//should be 0.01,actual be 0.01
cout <<value2<<endl;//should be 0.01,actual be 0.00999999
cout <<value2-value1<<endl;//should be 0,actual be -7.45058e-09
NaN操作数的浮点操作
操作 | 结果 |
±NonZero / 0 | ±Infinity |
±Infinity ±N | ±Infinity |
±Infinity * N | ±Infinity |
±Infinity / N | ±Infinity |
Infinity + Infinity | Infinity |
±Infinity / ±Infinity | NaN |
Infinity - Infinity | NaN |
±Infinity * 0 | NaN |
±0 / ±0 | NaN |
±Infinity * ±Infinity | ±Infinity |
0 / ±Infinity | 0 |
char a='ab';
cout<<a<<endl;//b
cin>>a;//d
cout<<a<<endl;//d
//宽字符字面量
//定义为wchar_t类型,并将其初始化为Z的宽字符表示,在字面量前面加L
wchar_t wide_letter=L'\x0438';
cout<<wide_letter<<endl;
//宽字符流
//cin和cout都是窄字符流
//<iostream>
wcin>>wide_letter;
//可以将宽字符输出到wcout中,但并不表示这种字符会正确显示,这取决于OS是否能识别。
wcout<<wide_letter<<endl;
//初始值的函数表示
char cc("ad");