这部分主要讲C 中的数据类型及其变体 前面也没用这方面的笔记,刚好趁着C 再复习一次 我们申明变量 int age; age = 15;语句告诉程序正在存储整数,程序找到一块能够存储整数的内存,将内存单元标记为age,然后把5拷贝到这个内存单元。
整型
C 提供了好几种整型,可以根据程序的具体需求选择合适的整型。不同C 整型类型占用的内存也不一样,占用内存越大,整型数值的范围也就越大,整型还分为有符号和无符号,即是否可表示正负。基本类型分别是short、int、long和long long 且他们通过使用不同的位数存储值,满足
short至少位
int至少于short一样长
long至少与int一样长
lomg long至少为64位 计算机的基本单位是字节 一个字节有8位 一位可以表示0和1,8位单元可以表示0-255或者-128到127 没有申明无符号型的话基本都是有符号类型的,那么我们该如何获取类型的限制信息 头文件climits中包含了关于整型限制的信息。 INT_MAX为int的最大取值 CHAR_BIT为字节的位数。
代码语言:javascript复制#include<iostream>
#include<climits>
using namespace std;
int main()
{
int n_int = INT_MAX;
short n_short = SHRT_MAX;
long n_long = LONG_MAX;
long long n_llong = LLONG_MAX;
//sizeof operator
cout << "int is " << sizeof(n_int) << " bytes" << endl;
cout << "short is " << sizeof(n_short) << " bytes" << endl;
cout << "long is " << sizeof(n_long) << " bytes" << endl;
cout << "long long is " << sizeof(n_llong) << " bytes" << endl;
cout << endl;
cout << "Maximum values " << endl;
cout << "int " << n_int << endl;
cout << "short " << n_short << endl;
cout << "long " << n_long << endl;
cout << "long long " << n_llong << endl;
cout << "Minimum values " << INT_MIN<<endl;
cout << "Bits per byte = " << CHAR_BIT << endl;//字节的位数
}
关于预编译处理,我之前有笔记已经详细讲过,只是单纯的字符串替换 关于变量赋值C 有C语言没有的初始化语法 int x{16}; 如何声明无符号数据类型 只需使用关键字unsigned 修改声明即可
代码语言:javascript复制#include<iostream>
#include<climits>
#define ZERO 0
using namespace std;
int main()
{
short sam = SHRT_MAX;
unsigned short sue = sam;
cout << "sam = " << sam << " sue = " << sue << endl;
sam = sam 1;
sue = sue 1;
cout << "sam = " << sam<< " sue = " << sue << endl;
sam = ZERO;
sue = ZERO;
cout << "sam = " << sam << " sue = " << sue << endl;
sam = sam - 1;
sue = sue - 1;
cout << "sam = " << sam << " sue = " << sue << endl;
}
如果超越了限制,其值将为范围另一端的取值。有迷惑的可以看看前面的位运算。
选择整型类型
int被设置为对目标计算机而言最为自然的长度,指的是计算机处理起来效率最高的长度,如果我们表示大于十六位的整数 最小大可以表示2^16(32767) 如果在32位系统可以用int表示 2147483647 ,这时候用int移植到16位系统时,就会无法正常工作,所以选择合适的数据类型是很重要的。以及包括整型数组使用short比int更加省内存,16位到32位系统数组内存并没有扩大。 C 可以以三种不同的计数方法,我们常见的157 123是以10为基数,C 使用前一俩位标识数字,如果第一位是1~9则基数为10如果第一位是0,第二位是1-7则,基数是8,如果前两位是0x或者0X,则基数是16。0XA65 = 5*16^0 6*16^1 A*16^2 = 2661 此外cout还提供了控制符dec hex和oct用来显示十进制 十六进制和八进制 比如
代码语言:javascript复制int h = 10;
cout<<hex
<<"h = "<<h<<endl;
C 确定常量的类型
程序如何确认常量是按什么类型存储,后缀表明了数字常量的符号,如果是l表示long,u表示无符号整数。对于不带后缀的十进制数,,将使用几种类型中可以存储该值的最小类型来表示:int long ,long long。如果是十六进制或八进制整数,将使用int unsigned int long unsigned long long long 或者unsigned long long 。unsigned int 表示范围比int范围对于内存地址这类无符号要大
char类型
char转为存储字符(字母和数字)而设计的。存储数字对于计算机算不了什么,编程语言通过数值编码实现了对字母的存储,一个char是八位,他可以存储-128~127的范围,如果是无符号它可以存放0~255 很多系统支持的字符不超过128个,虽然一般被用来表示字符,但它比作比short更小的整型类型。 我们平时常见的是Ascii码以及Unicode字符集,即宽窄字符,这在后面mfc的时候我会详细介绍。
代码语言:javascript复制#include<iostream>
using namespace std;
int main()
{
char ch = 'M';
int i = ch;
cout << "the Ascii code for " << ch << " is " << i << endl;
cout << "ADD one to code" << endl;
ch = ch 1;
i = ch;
cout << "the Ascii code for " << ch << " is " << i << endl;
cout.put(ch);
cout.put('!');
}
cin和cout会根据变量类型转换输出和输入,但作为内存存储,它是以数值编码存储的
我们根据cout引出成员函数的概念,成员函数归类所有,定义了如何表示和控制数据。这个put方法就是类对象cout来输出字符,要通过对象使用成员函数,必须用句点将对象名和函数名称put
连接起来。句点被称为成员运算符。
''表示字符常量,这样不管在什么系统下都表示是字符常量,不会因为编码不同造成错误,对于一些无法从键盘输入的字符,C 提供了转义序列
const限定符
前面我们用到了#define定义常量的方法,const可以更好地定义常量。 const int Months = 12; 常量被初始化,其值被固定了,编译器不准再修改该常量的值,因此const也叫限定符,常量的命名约定
首字母大写
整个大写
以k开头的命名 以上不是通用约定,创建格式const type name = value;尽量在申明中初始化值