数据类型
C语言类型分为内置类型和自定义类型。 基本内置类型: 自定义类型(构造类型):结构体类型、位段、枚举类型、联合体类型等。 ::: warning 类型的意义: 1.使用这个类型开辟内存空间的大小(如char类型开辟1个字节等) 2.类型决定了如何看待内存空间的视角。(如同样占4个字节的int类型和float类型存储时在内存中的存储方式不同,是由类型决定的) :::
类型的基本归类
- 整型家族
整型类型分为有符号和无符号。 如当描述一个浮点数时,8比特位的数字的最高位如果当作是符号位时,就是有符号数,0为正数1为负数。无符号数没有符号位,没有正负之分(都是正数)。 当符号位作为有效位时,能表示的数字的范围会更大。 长短整型的写法上可以省略int。 ::: tip char类型归入整型家族的原因是,char在内存中存储的是ASCII值,ASCII值是整数,相当于字符是使用整数来表示和存储的。所以char归类于整型,但char有专有名词是字符类型。 char类型的变量如果表示有符号数时,范围是-128到127,如果表示无符号数,范围是0-255。 ::: 2. 浮点型家族 3. 构造类型! 4.指针类型 指针类型的大小都是4个或8个字节。 5.空类型
整型在内存中的存储
原码、反码、补码
有符号数(负数)的三种表示方法,即原码、反码、补码。三种表示方法均有符号位(最高位)和数值位两部分,符号位都是0表示“负”,1表示“正”。数值位的三种表示方法各不相同。 ::: tip 无符号数也有原码、反码、补码三种表示方法,只是正数的原码、反码、补码相同。 有符号数的正数等同于无符号数,原码、反码、补码相同。 ::: 正数的原码反码补码相同。 原码:将整型数字按照正负数的形式翻译成二进制。 反码:在原码的基础上,符号位不变,其余各个位取反。 补码:在其原码的基础上,符号位不变,其余各位取反再+1 (即在反码的基础上+1)。
int main()
{
int a = 20;
//00000000000000000000000000010100 - 原反补
//补码二进制转十六进制内存地址。每四个二进制对应一个十六进制,如下:
//0000 0000 0000 0000 0000 0000 0001 0100
//0x00000014
int b = -10;
//10000000000000000000000000001010 - 原
//11111111111111111111111111110101 - 反
//11111111111111111111111111110110 - 补
//补码二进制转十六进制内存地址。每四个二进制对应一个十六进制,如下:
//1111 1111 1111 1111 1111 1111 1111 0110
//0xfffffff6
return 0;
}
在计算机系统中,数值一律用补码来表示和存储。 原因是使用补码可以将符号位和数值域统一处理,加法和减法也可以统一处理(CPU只有加法器)。补码与原码相互转换,运算过程是相同的,不需要额外的硬件电路。如下:
int main()
{
//计算机中只有加法器,1-1可以转换为1+(-1)
int a = 1;
//00000000000000000000000000000001 - 原
int b = -1;
//10000000000000000000000000000001 - 原
//11111111111111111111111111111110 - 原码相加
//当补码没有出现时候,原码相加得到的值是-2,计算结果错误。
//00000000000000000000000000000001 - 补
//11111111111111111111111111111111 - 补
//100000000000000000000000000000000 - 补码相加
//补码相加后的结果存储在内存中时,int类型是4字节32比特,发生截断,取后32位如下:
//00000000000000000000000000000000 - 0
return 0;
}
::: tip 二进制数与十六进制数之间的对应关系表: |0|1|2|3|4| |-|-|-|-|-| |0000|0001|0010|0011|0100| |5|6|7|8|9| |0101|0110|0111|1000|1001| |A|B|C|D|E| |1010|1011|1100|1101|1110 |F| |1011| :::
大小端
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。 小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。 ::: tip 例如一组数据是0x11223344,大端存储模式的存储方式为11223344。小端存储模式的存储方式为44332211。 (数据中从右往左是数字的低位到高位,内存中从左往右是内存的低位到高位) :::
int main()
{
int a = 20;
//0x00000014
return 0;
}
上图是a在内存中的存储,如图,0x00000014在内存中存储顺序是14000000,整型变量a的值中14处在低位,内存中14的地址是F4,后面三个00的地址分别是F5、F6、F7,d3的地址是F8,8e的地址是F9,第二行8e的地址是FA,系统中存储地址是由低到高的。 综上数据的低位(14)放在内存中的低位(F4),可得知系统采用的是小端存储模式。 大小端的区别实际上是内存中字节存放的顺序。