1
数据类型的种类:
char 1byte
short 2byte
int 4, 在16位机器下是2byte,32位与64位是4个byte
long (4/8)至于是4byte还是8byte,取决于编译器环境
long long 8byte(在C99标准下才引入long long),所以一般在新的编译器下才有这个类型
float 4byte
dobule 8byte
还有更多的数据类型,如要查找,可在cppreference等网站查看类型
2
整型:
char(char放入整型是因为每个字符变量的ASCII值是个整数)
{
分为 unsigned char
(sigend) char
不加unsigned默认为有符号类型(char是unsigned char,还是signed char 取决于编译器,不过大多数编译器为signed char)
}
short
unsigned short
(sigend) short
int
long
打印无符号的数只能用(%u),如果是无符号数用(%d)打印,会当作有符号数打印
为什么会变那么大是因为内存中存的是二进制形式的补码,补码最高位为有符号数,当类型变为无符号,最高位的符号数则会变为无符号运算,后面详细讲解
浮点型类型 (实型)
float
double
构造类型(自定义)
数组类型
结构体类型 struct
枚举类型 enum
联合类型 union
指针类型
char* p;
int* p;
void* p;
float* p;
等 多级指针类型
空类型
void
常应用于函数返回类型,指针类型,函数类型
3
原码反码补码
整数的二进制表示形式有三种,原反补码,而内存中存的是二进制的补码
正数的 原码 反码 补码相同
负数的则不同
原码:按照一个数直接写出来的二进制就是原码
如 15 ——>00000000 00000000 00000000 00001111(二进制原码)
最高位为符号位
符号位为0表示正数,符号位为1表示负数
-15 ——>10000000 00000000 00000000 00001111(二进制原码)
补:因为15为正数,所以它的原码反码补码都相同
反码:符号位不变,其他位按位取反
(-15)10000000 00000000 00000000 00001111(原码)——>
11111111 11111111 11111111 11110000(反码)
补码:反码的二进制序列+1
11111111 11111111 11111111 11110000(反码)——>
11111111 11111111 11111111 11110001(补码)
了解这些,unsigned int,就是把最高位的符号位当作无符号来使用,
当然首先要把内存中的补码转换成反码,再转换成原码来使用。
整数在内存中存补码原因:
1 计算机只能算加法,所以1-1==1+(-1)
如果计算机中用原码算,最高位是符号位,那符号位一个为1一个为0,
那到底是加还是不加呢,这无法判断所以原码首先是不能用于运算了,
如果用补码计算那最高位符号位可以把它挤出去,用补码就可以将符号位与
数值域统一处理
且补码与原码相互转换,其运算过程是相同的,都是取反+1
4
大端字节序和小端字节序
首先要知道如何查看数据在内存中的存储,第一步按F10进入调试,第二步
数据在内存中以二进制存储,在内存窗口以16进制展现,因为如果编译器以二进制
展示,数据太大,放不下
10的16进制原本位 00 00 00 0a,但内存中却以上图的形式展示,
这就与大小端字节序有关了。(这是小端字节序存储)
当一个数值在内存中存储,这个数值所占的大小超过一个字节,那
它在内存中的存储就有顺序了
大端(存储)模式:一个数据的低字节序的内容存放在高地址处,高字节序的内容
存放在低地址处,这种存储方式就是大端字节序存储,如图
小端(存储)模式:一个数据低字节序的内容放在低地址处,高字节序的内容存放在高地址处
这种存储方式就是小端字节序存储。
好,概念介绍完,练练题
设计一个程序来判断 当前机器的字节序
思路:通过大小端的存储模式不同,我们可以创建一个简单变量,然后判断这个
变量的第一个字节是否为某一值。为了拿到这个变量的第一个字节内容,我们可以
取地址,然后强制类型转换为(char*),放入char* 的指针并对指针解引用并判断,如图
代码为
int main()
{
int a = 1;
char* p = (char*)&a;//强制类型转换拿到第一个字节地址放char*便于解引用
if (*p == 1)//判断大小端
{
printf("小端");
}
else
{
printf("大端");
}
return 0;
}
如果错误,望斧正,谢谢谢谢



