C++数据类型
内置的C++数据类型:基本类型 、复合类型
简单变量
程序一般都要用来存储信息,为了把这些信息存储到计算计中必须要记录下三个基本属性
1.存在哪里
2.存什么值
3.存什么类型
使用变量进行存储
int n;
n = 5;
上面的语句就是告诉编译器要存一个整数,并且使用n来表示这个整数的值,也就是5
程序的做法大致是如下:先找到一块能存整数的内存,把这块内存单元标记为n,接下来就把5复制到这个已标记的内存单元中。程序在做了以上的步骤后就可以在程序中使用n来访问这个内存单元
当然程序不会告诉你这个值会存到哪个具体的内存位置,这些在程序内部是有做记录的,也可以通过&(取地址符)来获取到这个内存地址
一、变量名
C++中的变量命名规则
1.在名称中只能使用字母字符、数字和下划线(_)
2.名称的第一个字符不可以是数字
3.区分大小写
4.不可以把C++中预先定义的关键字做为变量名
5.以两个下划线或下划线和大写字母开始的名称被保留给编译器或其它资源使用,以一个下划线开头的被保留给编译器或其它资源作为全局标识符
6.C++本身对变量的名称长度没有限制,但某些平台上可能存在限制
如果想用两个或更多的单词来组成一个变量名常用的做法
1.每个单词之间使用下划线分隔开。比如:my_eye
2.从第二个单词开始个单词的首字母大写。比如:myEye
对于编译器来说只要是合法的变量名它都会正确处理,但做为一个好的编程习惯来说需要使用精确、统一格式的命名规范
二、整型
整数,就是没有小数部分的数字,有一个概念一定要注意对于计算机来说它能表示的肯定只是现实中整数的一个子集,它的存储空间有限,有些语言对整型就提供了一种,而C++则提供了几种可选的类型以便于在使用时选择更为合适的类型。
C++中不同类型的整数使用不同的内存量来存储整数,使用的内存量越大,可表示的整数范围就越大,另外有些类型(有符号类型)可以表示正负数,有些类型(无符号类型)则无法表示负数
上面所提到的内存量,也会有一个术语叫做宽度
C++的的基本类型按宽度来递增的话分别有:char、short、int、long、long long,再加上每种类型都有有符号、无符号两种总共是10种类型
三、short、int、long、long long
位(bit)的概念,在计算计中的内存由一些单元组成,每一个单元就是位
C++中short、int、long、long long类型通过使用不同数目的位来存储
1.short 至少16位,它实际上是short int 的简称
2.int 至少与short一样长
3.long 至少是32位,并且至少与int一样长,它实际上是 long int 的简称
4.long long至少是64位,且至少与long 一样长
位与字节
位:bit,它是计算机内存的基本单元,可以把它看作电子开关,可以开也可以关,开的时候值表示1,关的时候值表示0
字节:byte,通常来说8个位表示一个字节(8位的内存单元),它是描述计算机中内存量的度量单位 比如:1KB = 1024字节
sizeof运算符可以返回类型或者变量的长度,单位是字节
/*
作者:xiesheng
时间:2017-06-24
版本:v1.0
说明:C++中的整型
*/
#include <iostream>
#include <climits> //如果是老系统可以使用limits.h
int main() {
using namespace std;
int n_int = INT_MAX; //这些常量定义在limits.h头文件中
short n_short = SHRT_MAX; //这里不是SHORT_MAX而是SHRT_MAX 只能按定义来
long n_long = LONG_MAX;
long long n_llong = LLONG_MAX;
//通过sizeof运算符来计算每个类型的字节数
cout << "int is " << sizeof(int) << " bytes." << endl;
cout << "short is " << sizeof(short) << " bytes." << endl;
cout << "long is " << sizeof n_long<< " bytes." << endl;
cout << "long long is " << sizeof n_llong) << " bytes." << endl;
cout << "-----------------------每个类型的最大值-----------------------------" << endl;
//输出每一个类型的最大值
cout << "int:" << n_int << endl;
cout << "short:" << n_short << endl;
cout << "long:" << n_long << endl;
cout << "long long:" << n_llong << endl;
cout << "--------------------------使用常直接输出------------------------------" << endl;
cout << "int类型最小值:" << INT_MIN << endl;
cout << "每个字节的位数:" << CHAR_BIT << endl;
system("pause");
return 0;
}
运算符sizeof和头文件limits
sizeof两种运算方未予
1.使用sizeof(long);
2.对变量进行计算 sizeof n_long;
limits头文件:它定义了符号常量
它的文件中包含类似于 如下的语句
#define SHRT_MAX 32767
C++在编译的过程中,先把源代码传给了预处理器,这个时候编译指令告诉预处理器在程序中SHRT_MAX,并把所有的SHRT_MAX进行替换,替换为32767,在替换完成后再进行下一步的编译
注意在查找的时候只会查找独立的单词,并跳过嵌入的单词,比如对于 PSHORT_MAXP 这时就不会做替换
变量的初始化
int n_int = INT_MAX;
上面就是进行了一个初始化,把变量的声明与赋值放在同一个语句中完成。它的含义是声明一个int型变量并把该类型的最大值赋值给变量 n_int
初始化的方式:
1.直接使用字面常量来初始化
int n = 5;
2.可以使用另一个变量的值来初始化,条件是另一个变量已经是定义过的
int n = m;
3.可以使用表示式来进行初始化
int n = m+1;
C++有别于C的另一种初始化方式
int n(5);
int n = {5};
int n ={5};
int n={}/int n{};这里大括号中没有任何值则会初始化为0
使用大括号是一种通用的初始化语法,可以来初始化任何类型(常规变量、类变量)
对于自定义变量一定要在使用前进行初始化,要不然这个变量的值是不确定的,就是在它被创建之前相应内存单元中的值
建议:在声明变量时即给变量一个初始化的值,这样可保证后使用过程忘记赋值
无符号类型
注意:使用无符号类型的时候是可以增加变量的最大存储值,但是它会导致不可以存储负数(在某些场景下是可以支持的 比如分数、人口数量……)
要创建无符号版本的话则只需要加上unsigned来进行修改声明就可了
/*
作者:xiesheng
时间:2017-06-24
版本:v1.0
说明:C++中的整型
*/
#include <iostream>
#define ZERO 0
#include <climits> //如果是老系统可以使用limits.h
int main() {
using namespace std;
short sam = SHRT_MAX;
unsigned short jack = sam;
cout << "sam有 " << sam << "元。" << endl;
cout << "jack有 " << jack << "元。" << endl;
cout << "为sam和jack都多存入1元。" << endl;
sam = sam + 1;
jack = jack + 1;
if (sam < jack) {
cout << "sam和jack都多存入1元后,sam的钱比jack少了!" << endl;
}
else if (sam == jack) {
cout << "sam和jack都多存入1元后,sam的钱和jack的一样多!" << endl;
}
else {
cout << "sam和jack都多存入1元后,sam的钱比jack的多!" << endl;
}
//打印当前sam和jack的值
cout << "sam有 " << sam << "元。" << endl;
cout << "jack有 " << jack << "元。" << endl;
cout << endl;
cout << "把sam与jack的钱都归零!" << endl;
sam = jack = ZERO;
//打印当前sam和jack的值
cout << "sam有 " << sam << "元。" << endl;
cout << "jack有 " << jack << "元。" << endl;
cout << endl;
cout << "把sam和jack的钱再扣掉1元。" << endl;
sam = sam - 1;
jack = jack - 1;
if (sam < jack) {
cout << "sam和jack都多存入1元后,sam的钱比jack少了!" << endl;
}
else if (sam == jack) {
cout << "sam和jack都多存入1元后,sam的钱和jack的一样多!" << endl;
}
else {
cout << "sam和jack都多存入1元后,sam的钱比jack的多!" << endl;
}
//打印当前sam和jack的值
cout << "sam有 " << sam << "元。" << endl;
cout << "jack有 " << jack << "元。" << endl;
system("pause");
return 0;
}
sam有 32767元。
jack有 32767元。
为sam和jack都多存入1元。
sam和jack都多存入1元后,sam的钱比jack少了!
sam有 -32768元。
jack有 32768元。
把sam与jack的钱都归零!
sam有 0元。
jack有 0元。
把sam和jack的钱再扣掉1元。
sam和jack都多存入1元后,sam的钱比jack少了!
sam有 -1元。
jack有 65535元。
请按任意键继续. . .
从上面的结果可以看出对于无符号整数来说它的最大取值要比有符号的值大,所以在最大有符号的数值上加1再赋值给它是没有什么问题的,但当它到了0后再减去值时则会越界它又会跳到另一端去
整型类型的选择:
C++提供了多种可选择的整型类型,通常来说int型是对目标计算机来说的最佳选择类型,计算机对它的处理效率最高
1.首先考虑使用int
2.如果需要存储的数值不可能存在负值的情况可以考虑使用 unsinged,以便于可以存储更大的值
3.如果存储的值可能大于16位时,建议使用long,就算当前系统上int型是32位也需要这样(这样做可以保证程序在迁移到16位的平台时可以正常运行)
4.如果在存储的值要超过20亿则需要使用long long
5.如果short比int小,可以使用short,这样可以节省内存,但通常来说只有在处理大型数组的时候才会着重考虑这里节省的内存
6.如果只需要一个字可以选择char
整型的字面值
这里指的整型的字面值就是指的指面常量,也就是去显示的书写常量
C++中可以使用3种方式来书写整数:基数为10、基数为8、基数为16
C++使用前一(两)位来标识数字常的的基数
1.如果第一位是1~9,则基数是10
2.如果第一位是0,第二位是1~7,则基数是8
3.如果前两位是0x或0X,则基数是16
/*
作者:xiesheng
时间:2017-06-24
版本:v1.0
说明:C++中的整型
*/
#include <iostream>
int main() {
using namespace std;
int i = 42; //基数是10,第一位是1~9
int j = 0x42; //基数是16,前两位是0X
int k = 042; //基数是8,第一位是0,第二位是1~7
//注意:使用cout默认输出的时候都会显示为十进制数,如果不是则先转为十进制再显示
cout << "十进制数i(42),显示结果如下:" << i << endl;
cout << "十六进制数j(0X42),显示结果如下:" << j << endl;
cout << "八进制数k(042),显示结果如下:" << k << endl;
cout << endl;
system("pause");
return 0;
}
注意:上面说到的是十进制、八进制、十六进制数的表示,但实际在内存中的存储方式都是一样的(二进制的方式进行存储),这里仅仅只是显示的不一样而已。
/*
作者:xiesheng
时间:2017-06-24
版本:v1.0
说明:C++中的整型
*/
#include <iostream>
int main() {
using namespace std;
int i, j, k;
i = j = k = 42;
cout << "使用不同的进制表示42这个整数" << endl;
cout << "42,默认十进制显示如下:" << i << endl;
//输出调整为十六进制
cout << hex;
cout << "42,十六进制显示如下:" << j << endl;
//输出调整为八进制
cout << oct;
cout << "42,八进制显示如下:" << k << endl;
cout << dec;
cout << endl;
system("pause");
return 0;
}
使用不同的进制表示42这个整数
42,默认十进制显示如下:42
42,十六进制显示如下:2a
42,八进制显示如下:52
请按任意键继续. . .
C++如何去判读常量的类型?
这里编译器对字面字量的类型设定有强制的做法,除了有特殊的原因导致无法使用int存储的,C++编译器都使用int进行存储
这里的特殊原因
1.字面常量后使用了后缀人为指定了存储的类型
这里的后缀是指的放在数字常量后面的字母,用来指定类型,L/l表示long,u/U表示unsigned(u和l可以进行组 合),ll/LL表示long long
对于十进制、八进制和十六进制系统选择类型是有差别的
对于十进制,系统选择的顺序是 int ->long->long long
对于十六进制或八进制,系统选择的顺序是 int->unsigned int ->unsinged long->unsingned long long
原因是对于十六进制来说常常是用来表示内存地址所有unsingned long 比 long更合理
2.值太大无法使用int类型存储
3.能存储为int