C++学习 之 初识变量和基本类型 之 内置类型
声明:
本人自学C++, 没有计算机基础,在学习的过程难免会出现理解错误,出现风马牛不相及的现象,甚至有可能会贻笑大方。 如果有幸C++大牛能够扫到本人的博客,诚心希望大牛能给予批评与指正!不胜感激!
学习的过程分为初识、入门、进阶三个阶段。
因为对C++没有什么了解,这样的学习设定可能也有失准确性。望兄弟们多指点。谢谢!
科普:有效数字
有效数字是指一个数,从左边第一个非0数开始到末位最后一个数字 ,都被称为这个数的有效数字。比如0.009900,左边第一非0数字为9,后面还有3个数字,这4个数字都是有效数字。
1. 主要内置数据类型
还记得我们在初识C++时写的hello world么? 那几行代码中,我们见到过这样一个单词:int 。当时我只是简单说了下,这是C++的一种内置数据类型。今天我们来一起学习下C++都有哪些内置数据类型,都有什么特点。
1.1 首先我们来了解下,C++都定义了哪些数据类型
C++ 定义了一组表示整数、浮点数、单个字符和布尔值的算术类型。另外还定义了一种特殊类型:void。
void 类型没有对应的值,通常用作无返回值函数的返回类型。
这几种类型呢,在C++中又可以分成两大类:整型和浮点型(void类型除外)。
我们从以下几个方面来分析数据类型:
定义方式及表示方式
C++最小请求内存空间--存储空间
对于整型还涉及是否带符号
赋值
1.2 整形和浮点型
1.2.1 整型
整型根据不同的依据可以进行不同的分类。比如根据数据类型可以分为:整数,单个字符,布尔类型 ; 可以根据是否带符号分为:带符号与不带符号的类型。
分类一:整数、单个字符、布尔类型
数字
定义方式:int a=1; short a=1; long a=1;
不同类型的存储空间:
比如int:16位操作系统是2个字节,32/64位操作系统4个字节,也就是32bits,
比如long:64位操作系统,除了受到机器位数的影响,还受到数据模型(不是数据库的数据模型)影响,LLP64模型中long是32位外,LP64、ILP64、SILP64的long都是64位。
我们这里所说的最小存储空间,是指综合不同处理能力的CPU(比如32位的64位的)以及数据模型进行对比的,某个数据类型所需要的最小空间。比如int 类型,最小存储 空间是2个字节(16 bits), 如果请求的空间小于这个值,就会报错,而当前计算机的运行能力,一般分配给int类型的存储 空间为4个字节(32位),而空间的分配,是编译器自动分配的,不需要人为参与。至于自定义数据类型的空间如何分配,等 以后我们学到了,再去了解。
int 16bits
short 16bits
long 32bits
单个字符
定义方式:char a='a'; wchar_t a='我';
最小请求存储空间:
char 8bit
wchar_t 16bit
布尔类型
定义方式: bool a = true; boll a=false;在程序里,true 返回1,false 返回0;
最小请求空间:无。
分类二:带符号与不带符号的类型
除布尔类型外,其他整型值都可以分成带符号的或者不带符号的
整数:
带符号类型可以表示所有整数(包括负整数,0,正整数),不带符号的,只能表示非负整数。而默认情况下,都是带符号的(signed),如果想定义为不带符号的(unsigned) 类型则需要使用关键字unsigned
定义方式:unsigned (int) ,unsigned short unsigned long.
注意: unsigned int 中的int 可以省略,也就是说unsigned 默认表示为 不带符号的int类型。
至于字符类型:
也分为带符号的与不带符号的。但是与整数不同,字符类型分为plain char,unsigned char,signed char 虽然分为三种类型,却只有两种表示方式。你肯定要问为什么了。两种表示方式肯定是unsigned 和 signed的两种。那plain char又是什么呢?
plain char 只是一种称谓,它可以是signed char 也可以是unsigned char,那到底是哪个呢?这具要默认由编译器来决定,当然你也可以自己决定 ,g++ 编译器有4个参数:
-funsigned-char
-fno-signed-char
-fsigned-char
-fno-unsigned-char
前两个参数将char类型设置成unsigned char,后两个参数告诉编译器将char类型全部识别为signed char
取值范围:
无符号类型,所有位数都表示数值,带符号类型,策略上保留一位用作符号位,符号位为1为负数,0则为非负数。
正是因为符号位的存在,导致带符号类型与无符号类型数值的取值范围存在差异。
带符号类型被分配16位空间,取值范围为:-2 -15次方(至少是-2 -15次方加1)至2的15次方减1,而不带符号类型,取值范围为0至2的16次方减1。
假如int被分配出8位的空间,不带符号的取值范围为-127~127(有的环境里可以取到-128),带符号的取值范围为0~255.
赋值:
关于整型的赋值,我们这里只说下整数的赋值。赋值在某个类型的取值范围内,那赋值很简单,比如:unsigned a=254;
但是如果越出了取值范围呢?要分是否带符号进行分别对待
不带符号的情况 :
假设在8位的存储空间中,取值范围是0~255,如果是256怎么办呢? C++中会对两个值进行加减运算。如果大于255则进行减法运算(赋值-最大值),如果小于0,则进行加法运算,比如-1,赋值的结果,会是254,相当于-1+255
带符号的情况:
一般情况下,带符号的类型,赋值超出取值范围,会像不带符号的类型那样进行加减运算,但是并不一定所有编译器都会是这样的处理的。
1.2.2 浮点型
类型 float、 double 和 long double 分别表示单精度浮点数、双精度浮点数和扩展精度浮点数。一般 float 类型用一个字(32 位)来表示,double 类型用两个字(64 位)来表示,long double 类型用三个或四个字(96 或 128 位)来表示。类型的取值范围决定了浮点数所含的有效数字位数。
2. 字面值常量(2014-07-14更新)
1. 什么是字面值常量
痛苦死啊~对于字面值常量这一节,两个星期前就看了几遍,可是就是不是很明白到底是什么东西。放了两个星期,今天再来看,思路已经有些很清晰了。
其实字面值常量,是未定义而被直接使用的内置基本类型(除short类型外),其特点是不能修改,用值本身进行命名。
需要注意的是: 只有内置数据类型有字面值常量,没有类类型的字面值常量,所以也没有标准库字义的字面值。内置类型中,没有short类型的字面值
2. 字面值常量的表现形式(ASCII)
十进制: 20
八进制: \024 -- ASCII 用 8进制 表示需要以\ 开头
十六进制: \x14 -- ASCII 用16进制 表示需要以\x开头
3. 字符与字符串
单个字符 需要以单引号: '' 来引用
字符串 需要以双引号: "" 来引用 ,为了兼容 C 语言,C++ 中所有的字符串字面值都由编译器自动在末尾添加一个空字符
如:'A' 就是字符A,"A" 则是单字符A+空格 两个字符。
4. 整型的不同使用方式
类型 | 表现方式 |
int(整数类型中默认为Int 或long 根据字面值大小自动决定) | 变量: int a=1; 常量:1 |
short | 变量:short int a; 常量: |
long | 变量:long int a; 常量:1L(L 可以是小写,但是建议使用大写,小写容易与数字1混淆) |
char | 变量:char n='a'; 常量:'a' |
wchar_t | 变量:wchar_t n; 常量:'a'L |
float | 变量:float n; 常量:0.1314f 或者0.1314F |
double(浮点类型中默认为double) | 变量:double n; 常量:0.1314 |
long double | 变量:long double n; 常量:0.1314L |
布尔 | true 或者 false |
不带符号(我们知道默认是带符号的) | 10u(不带符号的整型) 、10Lu(不带符号的长整型)、 10LU(不带符号的长整型) |
5. 字符(串)连接
std:cout<<"Hello " "world"<<endl; 输出结果等价于:<br="">
std:cout<<"Hello world"<<endl; 输出结果等价于:<br="">
std:cout<<"Hello "
"world"<<endl; 输出结果等价于:<br="">
std:cout<<"Hello " <<"world"<<endl; 输出结果等价于:<br="">
std:cout<<"Hel\
lo w\
orld"<<endl;
注意反斜线符号必须是该行的尾字符——不允许有注释或空格符。同样,后继行行首的任何空格和制表符都是字符串字面值的一部分。正因如此,长字符串字面值的后继行才不会有正常的缩进
6. 字面值常量会在什么情况下出现
std::cout // 指针的定义和赋值。
其他情况尚未想到,如果哪位仁兄发现还有其他情况,辛苦辛苦指点下小弟。
===================
天行健,君子以自强不息
地势坤,君子以厚德载物
===================