C++ 数据类型

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 char0~2^8-1
short 
unsigned short 
int 
unsigned int 
long 
unsigned long 


整型数值的前缀和后缀

没有前缀十进制
前缀为0x或0X十六进制
前缀为08进制
后缀为u或 U不带符号的类型
后缀为l或Llong类型

整型字面量与前后缀

字面量十进制整型没有前缀,其值在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)1823
double双精度64bit(8Byte)11152
long double扩展的双精度
128bit 1
 



精度指尾数中的位数,单精度<双精度<扩展的双精度
这些类型的精度和数值范围由编译器决定,编译器通常会最大限度的利用计算机提供的浮点数功能。
在计算机中,任何一个数都可以表示成 1.xxxxxx * 2^n 这样的形式,其中xxxxx就表示尾数部分,n表示指数部分。
其中,因为最高位的1,由于任何的一个数表示成这种形式时这里都是1,
所以在存储时实际上并不保存这一位,这使得float的23bit的尾数可以表示24bit的精度,double中52bit的尾数可以表达53bit的精度。



数据类型表达精度
实际表达精度(多一个前面的1.)
float2323+1=24
double5252+1=53
long double  

对于float型数据,可以精确到小数点后几位呢?

 十进制中的9,在二进制中的表示形式是1001,这里也就告诉我们,表示十进制中的一位数在二进制中需要4bit,
所以我们现在float中具有24bit的精度,所以float在十进制中具有 24/4=6,
所以在十进制里,float能够精确到小数点后6位。
同理,具有53bit精度的double类型能够精确到小数点后13位。







Demo:
数字 float 9.125 在十进制中用科学计算的方式表示为9.125*10^0,
但是在计算机中,计算机只认识0和1,所以在计算机中是按照科学计算的二进制的方式表示的:
9 的二进制表示为 1001
0.125 的二进制表示为 0.001
所以9.125的表示成1001.001 
将其表示成二进制的科学计数方式为  1.001001 2^3


对于float类型,他的指数部分有8bit,可以表示-127~128,但是这里采用了移位存储的方式,
在存储指数时数据的基数是127,而不是0。
例如上面的9.125,其二进制的指数部分为3,
所以在存储时实际上存的是127+3=130。(130的二进制表示为10000010



最后在尾数的后面补0,一直到补够23位

最终根据上面图中float的存储结构可以知道,实际上9.125在计算机中:
SignExponent(符号位1bit + 7bit)Mantissa
1bit8bit23bit
110000010
0010010 00000000 00000000
   

上面的二进制数转换成十六进制后表示形式为: 01000001 00010010 00000000 00000000 
------------------>>>>>>>>>>>>>>>>>>------------ 41 10    0000
实际上在X86计算机中,采用的是小端存储方式,即低地址存储低位数据,高地址存储高位数据。
所以数据应该是这样存储的:
高地址.....
41
10
00
低地址00

附录: 由于Intel CPU的架构是Little Endian,所以它是按字节倒序存储的,那么就因该是这样
 00000000 00000000 00010010 01000001 
  00     00 10    41


加f或F为float类型,默认为double。
加l或L为long double类型。

	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操作数的浮点操作
±Infinity:二进制尾数都是0,指数都是1,符号为+/-。
NaN:用于表示数学上没有定义的结果。
操作结果
±NonZero / 0±Infinity
±Infinity ±N±Infinity
±Infinity * N±Infinity
±Infinity / N±Infinity
Infinity +  InfinityInfinity
±Infinity / ±InfinityNaN
Infinity -  InfinityNaN
±Infinity * 0NaN
±0 / ±0NaN
±Infinity * ±Infinity±Infinity
0 / ±Infinity0



	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");


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值