C++ primer plus第三章基本数据类型

C++内置类型可分为:基本类型和复杂类型。
基本类型:整数和浮点数,以及其变种。
复杂类型:数组、指针、结构、字符串。
使用变量、指针来标识所存储的数据,若变量名由多个单词构成,可以用下划线分隔或是每个单词的首字母大写表示。

一、整形(没有小数部分的数字)
整数可以很大,因此程序语言所能表达的数值范围仅是整数的一个子集。C++基本整形有char 、short 、int 、long 、long long。可用来表示数值的位数不同,有符号、无符号的区别。根据实际意义,数值不会为负时,采用无符号表示来存储数据,相同的宽度下能表达更多的数值。unsigned char、 unsigned short 、unsigned int、 unsigned long 、unsigned long long。
关于类型选择:
只需要一个字节,选用char型;
数据位数大于16bit,为了实现可移植性,选用long型;
不为负数,选用无符号类型。

sizeof(数据类型、变量)单位是字节,不同的系统下字节定义的位数可能不同。
头文件climits定义了编译器支持的数据值范围。
CHAR_BIT 表示了字节位数;
INT_MAX表示了有符号的INT的最大值
UINT_MAX表示了无符号的INT的最大值等等。
在函数内部定义的局部变量没有默认初始值,仅仅声明而不做初始化,此变量表示的值很可能是先前某个变量的值,太危险了。所以,提倡用的时候声明并初始化变量。
讲到初始化,传统的C用赋值符号=来做初始化,C++11提倡用初始化列表器{}来初始化变量、数组、结构、类对象(无论是什么类型,都可用初始化器来初始化,而不必对不同的类型采取不同的赋值方式,可以说是更通用的存在了),使用初始化器的好处有哪些呢?第一,初始化器可以为空,则为变量赋默认值;第二,不用写幅值号了;第三,防止窄化。
这么多的整形类型,如何选择最佳的整形类型来表示我们的变量呢?
万金油就是int啦,但当数据值太大则选long或unsigned ;已知数据值不可能为负,选unsigned;只需一个字节表示用char。
在程序中如何表达一个整形字面值:十进制、八进制(0)、十六进制(0x),但程序存储的是二进制!上面讲的是你想怎么表达一个整形字面值,使用cout输出的时候,无论你是怎么表达的,输出默认是十进制,若希望改变输出的形式,使用cout<<oct(cout<<hex)则可以改变输出数据形式。考虑给一个整形字面值,计算机将如何为它分配存储数据类型,和人的思路一样,默认int,除非使用后缀明确指定存储的数据类型或是int无法表示该数值。

char类型:字符类型!
计算机只能表示数据,太单一了吧,但是考虑到计算机只能存01,好吧,最终还是要找对一种映射关系把字符变成数值,于是乎伟人们发明了ASIIC、UNICODE将字符与数值对应起来,那么计算机存的就是数值啦。后来,为了能表示更多的字符,有了unicode通用编码名,为字符指定编号,但是在不同的机器上字符真实存储的数值还是由实现来决定。
char是一个字节长度,专门被用来存储字符的数值编码值。使用cin存入输入字符常量,计算机实际存的使其编码的二进制。对于cin、cout来说,他会根据数据类型来决定输出的结果是数据值或是字符。字符集越大时,仅使用一个字节已经无法存储字符的数值编码了,因而产生了wchar_t类型,两个字节(对于字面值来说,使用前缀L可表示为宽字符类型,同样的有wcin和wcout区分呢=),但是具体的长度由实现确定,再次改进,定义了char16_t和char32_t类型,分别用16位、32位来表示一个字符(对于一个字面值,使用前缀u、U可表示16或32位unicode字符)。char单纯存整形数值时被视为有符号或是无符号是由机器实现来决定的,但可以通过明确指定unsigned 或signed 指定存储时数值类型。

布尔类型:
用来表示真假,true和false。非0的数值表示true,0表示false。
通过提升(强制类型转换),将bool类型转为int类型;而int等类型通过隐式转化就可变为布尔类型。

二、符号常量:
使用const修饰符,程序很可能出现多次使用一个常量,因而使用符号常量来代替直接使用常量值,符号常量一经声明数值就不能再变了,编译器会阻止修改数值的操作,注意不要将声明和初始化分开写,其实编译器也会提示此类非法行为。

三、浮点数:
可表示小数、很大的数(超过了整形可表示的范围)、很小的数。
程序中给定一个字面值,如何确定是以整形方式存储还是以浮点数方式存储呢?有两种方式可以供程序猿选择,一个使用小数点(小数格式),另一种是基数E(e格式)。第二种方式的n表明了缩放,表明小数点如何移动。
根据数据可表示的精度(有效位数)和范围的不同,浮点数分为float 、double、long double三种类型。
对于字面值浮点数,不指明后缀默认以double类型存储,可选用f或L表示希望用float类型或是long
double类型存储。

总结:
算数类型:整形和浮点型
整形:有符号和无符号的short 、int、long、char、long long、wchar_t、char16_t 、char32_t;bool
浮点型:float 、double、 long double

四、算术运算符
优先级和结合性,都是针对一个操作数左右两侧均有运算符的情况才适用!先判断左右两侧运算符的优先级,相同时根据结合性来判断是先做左侧的运算还是先做右侧的运算。
除法:
两个整形数据做除法,结果只保留整数部分;
double/double 、 float/float 涉及了C++内置运算符重载
此外,求模运算常和两个整形数据的除运算一同出现。

五、类型转化
C++提供了丰富的类型,那么丰富的类型之间是如何做运算的呢?如何解决混乱的情况?
类型转化!
当进行赋值、传递参数、执行表达式是但凡类型不一样,执行类型转化。
1.传统赋值操作
当被赋值对象可表达的范围小于赋值对象时,赋值对象的数据值进行转化使得可存储在被赋值对象的数据范围内,所谓的窄化;否则,扩充被赋值对象(增加位数,但数据值不发生变化了),编译器不会产生错误提示,顶多就是数据精度损失。
赋值对象数据值不发生变化,针对被赋值对象的数据类型并利用赋值对象的数据值来产生新的数据值赋值给被赋值对象。
2.使用初始化列表器{}
整形数据之间或是整形转浮点数据,服从当被赋值对象无法表示赋值对象的数据值,编译器产生错误。这里需要注意,不是int转化char一定会报错,只要char只够表达出正确的数据值就不会报错。
但是浮点数转整形数编译器一定不给通过,无论小数部分为0,或是E型数据可用int类型表达编译器都会产生错误。
3.表达式中的类型转化
整形提升:bool、char、short自动转化为int
不同类型做运算,将较小的类型转化为较大的类型
4.强制类型转化
赋值对象本身不会发生什么变化,只不过根据被赋值对象类型来创建新的、指定类型的值。
基本强制类型转化写法:type (变量名)或是 (type) 变量名 分别对应C++写法和C写法
C++引入了更为严格的类型转化,比如static_cast<新类型>可以将一种数值类型转化为另一种数值类型,使得一种格式数据可以满足不同的期望。
5.auto推断数据类型
用在声明及初始化变量时,根据赋值对象类型来确定被赋值对象的数据类型。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值