文章目录
一. 数据类型介绍
-
C语言中基本的内置类型:
char //字符数据类型.
short //短整型.
int //整形.
long //长整型.
long long //更长的整形.
float //单精度浮点数.
double //双精度浮点数.
整型表示的范围:limis.h中定义
-
以及他们所占存储空间的大小:
#include <stdio.h>
int main() {
printf("char size = %u\n", sizeof(char)); // 1.
printf("short size = %u\n", sizeof(short)); // 2.
printf("int size = %u\n", sizeof(int)); // 4.
printf("long long size = %u\n", sizeof(long long)); // 8.
printf("float size = %u\n", sizeof(float)); // 4.
printf("double size = %u\n", sizeof(double)); // 8.
return 0;
}
-
类型的意义:
-
使用这个类型开辟内存空间的大小(大小决定了使用范围)。
-
如何看待内存空间的视角。
-
1.1. 整形家族
// char
unsigned char // 无符号.
signed char // 有符号.
// short
unsigned short [int] // 无符号.
signed short [int] // 有符号.
// int
unsigned int // 无符号.
signed int // 有符号.
// long
unsigned long [int] // 无符号.
signed long [int] // 有符号.
// long long
unsigned long long [int] // 无符号.
signed long long [int] // 有符号.
1.2. 浮点数家族
float // 单精度浮点型.
double // 双精度浮点型.
1.3. 构造类型
int [] // 数组类型.
struct // 结构体类型.
enum // 枚举类型.
union // 联合类型.
1.4. 指针类型
int *pi; // int型指针.
char *pc; // char型指针.
float* pf; // float型指针.
void* pv; // 空指针.
1.5. 空类型
void // 表示空类型(无类型)通常应用于函数的返回类型、函数的参数、指针类型。
二. 整形在内存中的存储
-
那接下来我们谈谈数据在所开辟内存中到底是如何存储的?
int a = 20;
int b = -10;
// 我们知道为 a 和 b 都分配四个字节的空间,那如何存储?
-
数组在不同的表现形式
// 2进制、8进制、十进制、十六进制
// 比如:十进制的21
// 二进制表现形式: 0b10101 0b开头代表二进制
// 八进制表现形式: 025 0开头代表八进制
// 十进制表现形式: 21
// 十六进制表现形式:0x15 0x开头代表十六进制
2.1. 原码、反码、补码
-
计算机中的整数有三种2进制表示方法,即原码、反码、补码。
-
正数的原、反、补码都相同。
-
负整数的三种表示方法各不相同。,三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位
-
原码:直接将数值按照正负数的形式翻译成二进制就可以得到原码。
-
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
-
补码:反码+1就得到补码。
// 正整数
int a = 20;
// 源码:00000000000000000000000000010100 -- 源码 相同
// 十六进制:0x00 00 00 14
// 反码:00000000000000000000000000010100 -- 反码 相同
// 十六进制:0x00 00 00 14
// 补码:00000000000000000000000000010100 -- 补码 相同
// 十六进制:0x00 00 00 14
// 负整数
int b = -10;
// 源码:10000000000000000000000000001010 -- 源码 直接通过正负的形式写二进制序列就是源码
// 十六进制:0x80 00 00 0a
// 反码:11111111111111111111111111110101 -- 反码 原码的符号位不变,其他位按位取反就是反码
// 十六进制:0xfffffff5
// 补码:11111111111111111111111111110110 -- 补码 反码+1就是补码
// 十六进制:0xfffffff6
对于整形来说:数据存放内存中其实存放的是补码。
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
我们可以看到对于a和b分别存储的是补码。但是我们发现顺序有点不对劲,为什么呢?
// 解释计算机中为何存放的是补码:1-1 = 1+(-1)
// 源码计算:
// 00000000000000000000000000000001 -- 1的源码
// 10000000000000000000000000000001 -- -1的源码
// ---------------------------------------------
// 10000000000000000000000000000010 -- -2的源码
// 1+(-1) = -2 结果是不对的.
// 补码计算:
// 00000000000000000000000000000001 -- 1的补码
// 11111111111111111111111111111111 -- -1的补码
// ---------------------------------------------
// 00000000000000000000000000000000 -- 0的补码
// 将数据转为源码
// 00000000000000000000000000000000 -- 0的补码
// 11111111111111111111111111111111 -- 取反
// 00000000000000000000000000000000 -- +1得到源码
2.2. 大小端介绍
2.2.1. 什么大端小端
大端(存储)模式:是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中。
小端(存储)模式:是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。
2.2.2. 为什么有大端和小端
为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8 bit。但是在C语言中除了8 bit的char之外,还有16 bit的short型,32 bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多