- 1. 基本的数据类型
- 1.1 数据类型的归类
- 1.1.1 整型家族
- 1.1.2 浮点家族
- 1.1.3 构造类型
- 1.1.4 指针类型
- 1.1.5 空类型
- 2. 整型在内存中的存储
- 2.1 原码、反码、补码
- 2.2 大小端
- 2.3 整型提升
- 2.4 练习
- 3. end
char //字符型 1个字节 short //短整型 2个字节 int //整型 4个字节 long //长整型 4个字节 long long //更长的整型 8个字节 float //单精度浮点型 4个字节 double //多精度浮点型 8个字节1.1 数据类型的归类 1.1.1 整型家族
char
unsigned char
signed char
short
unsigned short
signed short
int
unsigned int
signed int
long
unsigned long
signed long
long long
unsigned long long
signed long long
1.1.2 浮点家族
float double1.1.3 构造类型
//数组类型 //结构体类型 struct //枚举类型 enum //联合类型 union1.1.4 指针类型
char* pa; int* pb; float* pc; void* pd;1.1.5 空类型
void 表示空类型(无类型) 通常用于函数的返回类型、参数类型、指针类型2. 整型在内存中的存储
一个变量的创建需要在内存中开辟空间,所开辟空间的大小数据类型决定。
那么,数据是如何在所开辟空间中存储的呢?
我们知道,数据在内存中以二进制的形式存储,且存储的是数据的补码
这里我们要了解以下概念:
2.1 原码、反码、补码计算机中的整数有三种表示方法,即原码、反码和补码。
这三种表示方法均有符号位和数值位两部分:
符号位:‘0’为正;‘1’为负
数值位:负整数的表示如下
原码:直接将数据的二进制按照正负数的形式翻译成二进制就行
反码:原码的符号位不变,其余位按位取反
补码:反码+1
比如:
int a = 10; int b = -20;
//b 10000000 00000000 00000000 00010100 //原码 11111111 11111111 11111111 11101011 //反码 11111111 11111111 11111111 11101100 //补码
正整数的原码、反码、补码相同
//a 00000000 00000000 00000000 00001010 //原码=反码=补码
对于整型来说,数据在内存中存放的是补码
为什么?
在计算机系统中,数值一律用补码表示和存储。原因在于,使用补码,可以将符号位和数值位统一处理。 同时,加法和减法也可以统一处理(cpu只有加法器),此外,补码与原码相互转换,其运算过程相同(符号位不变,其余位按位取反,再+1),无需额外的硬件电路。
这里我们看到的(16进制)a的补码:0000000a;b的补码:ffffffec
但是顺序是不是弄反了?
这就与大小端有关了:
2.2 大小端是什么:
大端(字节序存储)模式:将一个数据的高位字节序内容放在低地址处,把低位字节序内容放在高地址处;
小端(字节序存储)模式:将一个数据的高位字节序内容放在高地址处,把低位字节序内容放在低地址处。
机器是大端还是小端取决于硬件
如何判断自己的机器是大端还是小端呢?
int check_sys()
{
int a = 1;
return *(char*)&a;
}
int main()
{
int ret = check_sys();
if (ret == 1)
printf("小端n");
else
printf("大端n");
return 0;
}
2.3 整型提升
C的整型算术运算总是至少以缺省整型类型的精度来进行的。
为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升
整型提升的意义:
表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运 算器(ALU)的操作数的字节长度一般就是int的字节长度,同时也是 CPU的通用寄存器的长度。
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换 为CPU内整型操作数的标准长度。
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节 直接相加运算(虽然机器指令中可能有这种字节相加指令)。所 以,表达式中各种长度可能小 于int长度的整型值,都必须先转
换为int或unsigned int,然后才能送入CPU去执行运算。
**规则:**对于有符号数,按照符号位补(即符号位是什么,就补什么);对于无符号数,直接补0;
2.4 练习int main()
{
char a = -1;
signed char b = -1;
unsigned char c = -1;
printf("%d %d %d", a, b, c);
return 0;
}
解析:
这里先整理整型的存储,其它类型的后续再添加。
感谢观看!
老铁,来波三联支持下吧!



