【C语言】 数据的存储 -- 数据类型介绍 -- 存储 -- 浮点型在内存中的存储,很详细也很重要,不明白的一定要看1

简介: 【C语言】 数据的存储 -- 数据类型介绍 -- 存储 -- 浮点型在内存中的存储,很详细也很重要,不明白的一定要看1

*************************************************正文开始*************************************************

1、数据类型介绍

前面我们已经学习了基本的内置类型(C语言已经有的类型叫做内置类型)
char         short         int         long         long long         float         double

以及他们所占存储空间的大小。

类型的意义:

       1.使用这个类型开辟内存空间的大小(大小决定了适用范围)。

       2.如何看待内存空间的视角。

1.1 类型的基本归类

整型家族:

char
  unsigned char
  signed char//char = signed char 是取决于编译器的
short
  unsigned short [int]//这里的int可以不写,下面一致 
  signed short[int]//short = signed short ,signed 可省略
int 
  unsigned int 
  signed int //int = signed int ,signed 可省略
long
  unsigned long [int]
  signed long [int]//long = signed long ,signed 可省略

注:


1.字符存储和表示的时候本质上使用的是ASCII码值,ASCII码值是整数,因此字符类型也归类到整型家族;


2.数值在分类的时候有正有负,因次就存在 unsigned(无符号,只有正),signed (有符号,可正可负),平时写的 int = signed int,signed可省略 。但是 char == signed char 是取决于编译器的(见到的编译器上大多是等于的)。


浮点型家族:

float
double

构造类型(自定义类型):

>数组类型  //int arr[5],char str[10]
>结构体类型 struct
>枚举类型 enum
>联合类型 union

指针类型:

int *pi;//+-1跳过几个字节看指针的类型,解引用访问几个字节也是看指针类型
char *pc;
float *pf;
void *pv;

空类型:

void 表示空类型(无类型)

通常应用于函数的返回类型、函数的参数、指针类型。

函数不希望有任何返回值就用 void ;函数的参数写成 void 代表了这个函数不需要参数;void* p 是无具体类型的指针。

2、整型在内存中的存储

一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的。

那接下来我们他谈数据在所开辟的内存中到底是如何存储的?

比如:

int a = 20;
int b = -10;

我们知道为 a 分配四个字节的空间。

那如何存储?

下来了解下面的概念:

2.1 原码、反码、补码

计算机中的整数有三种2进制的表示方法,即原码、反码、补码。

三种表示方法均有符号位和数值位两部分,符号位都是用‘0’表示“正“,用‘1’表示”负“,而数值位只要把这个数字表示清楚就可以。
正数的原、反、补码都相同。

负整数的三种表示方法各不相同。

举例:

int main()
{
  int a = 20;
  //原码:00000000 00000000 00000000 00010100
  //反码:00000000 00000000 00000000 00010100
  //补码:00000000 00000000 00000000 00010100
  int b = -10;
  //原码:10000000 00000000 00000000 00001010
  //反码:11111111 11111111 11111111 11110101
  //补码:11111111 11111111 11111111 11110110
  return 0;
}


原码


直接将数值按照正负数的形式翻译成二进制就可以得到原码。


反码


将原码的符号位不变,其他位一次按位取反就可以得到反码。


补码


反码+1就得到补码。


对于整型来说:数据存放内存中其实存放的是补码。


我们为了更加清楚,使用调试可以观察一下内存中如何存储:


正数的原反补码相同说明不了问题,我们来看负数的


这里是为了方便展示所以用的 16进制,在内存中就是以 2进制存储的。2进制数转换为 16进制数就是 ff ff ff f6。


Q:为什么数据存放内存中其实存放的是补码呢?


A:在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;


同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互交换,其运算过程是相同的,不需要额外的硬件电路。


这段话有点难理解,我们举例来说明一下:


我们以 1 - 1 来说。上面的话说 CPU 只有加法器,而我们这里却是用减法处理的,因此我们改写为 1+(-1),而CPU就是这样来做的。

int main()
{
  1 + 1;
  1 + (-1);
  //1的补码: 00000000 00000000 00000000 00000001
  //-1的原码:10000000 00000000 00000000 00000001
  //-1的反码:11111111 11111111 11111111 11111110
  //-1的补码:11111111 11111111 11111111 11111111
  //1+(-1)补码相加:1 00000000 00000000 00000000 00000000
  return 0;
}

分析:



这也说明了内存中存储的是补码。

相关文章
|
26天前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
31 3
|
13天前
|
监控 算法 应用服务中间件
“四两拨千斤” —— 1.2MB 数据如何吃掉 10GB 内存
一个特殊请求引发服务器内存用量暴涨进而导致进程 OOM 的惨案。
|
11天前
|
C语言
【c语言】动态内存管理
本文介绍了C语言中的动态内存管理,包括其必要性及相关的四个函数:`malloc`、``calloc``、`realloc`和`free`。`malloc`用于申请内存,`calloc`申请并初始化内存,`realloc`调整内存大小,`free`释放内存。文章还列举了常见的动态内存管理错误,如空指针解引用、越界访问、错误释放等,并提供了示例代码帮助理解。
24 3
|
13天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
25 1
|
17天前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
19天前
|
监控 Java easyexcel
面试官:POI大量数据读取内存溢出?如何解决?
【10月更文挑战第14天】 在处理大量数据时,使用Apache POI库读取Excel文件可能会导致内存溢出的问题。这是因为POI在读取Excel文件时,会将整个文档加载到内存中,如果文件过大,就会消耗大量内存。以下是一些解决这一问题的策略:
50 1
|
22天前
|
缓存 安全 Java
使用 Java 内存模型解决多线程中的数据竞争问题
【10月更文挑战第11天】在 Java 多线程编程中,数据竞争是一个常见问题。通过使用 `synchronized` 关键字、`volatile` 关键字、原子类、显式锁、避免共享可变数据、合理设计数据结构、遵循线程安全原则和使用线程池等方法,可以有效解决数据竞争问题,确保程序的正确性和稳定性。
33 2
|
26天前
|
存储 编译器
数据在内存中的存储
数据在内存中的存储
37 4
|
27天前
|
编译器 程序员 C语言
深入C语言:动态内存管理魔法
深入C语言:动态内存管理魔法
|
27天前
|
存储 C语言 C++
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体