深度理解C语言一——整型数据在内存中的储存

简介: 深度理解C语言一——整型数据在内存中的储存

前言


本篇文章重点理解数据在内存中是如何存储的,内容较为抽象,希望大家多理解记忆。


整形数据在内存中的储存


1.原码,反码,补码的介绍

原码反码和补码是一种计算机中对数字的二进制的表示方法

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

反码:将原码的符号位不变,其他位依次按位取反就可以得到了。(负数)

补码:反码+1就得到补码。(负数)

正数的原、反、补码都相同。

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


2.以char为例理解signed(有符号数)和unsigned(无符号数)

这个有符号数和无符号数其实按字面意思理解就行了,

重点理解一下,无符号数不认识符号位,无符号数不认识符号位。这句话的是什么意思呢?

这里举一个例子。

这里我们定义了一个无符号变量a,给他赋值为-10,按理说都无符号数了,怎么能给它赋值成负数呢。这个想法是对的。我们来把这个数打印出来看看是不是我们想要的-10。

我们得到的却是246,没有得到-10。而且编译器也没有报错。这里就详细学习一下。

所以我们得出char数据的取值范围为-128到127,如果输入这个范围以外的数,也会被转换成这个范围内的数。

理解了上述图,我们就可以解释一下无符号数不认识符号位是什么意思了。

unsigned char a=-10;

二进制补码为:11110110****

我们知道开头的1为符号位,表示这个数是负数,如果符号位是0,表示这个数为正数。

但在如果是无符数,根本不认识符号位。无符号数把符号位也看做位权,计算数值的时候也要计算,比如开头这个1就会计算为2的7次方。


所以打印时的值的计算逻辑为:存-10存的是补码,而打印时打印是原码,但无符号数原码=补码,所以打印的值=2的七次方+2的六次方+2的五次方+2的四次方+2的二次方+2的一次方=246


3.大小端介绍

什么是大小端?大端就是大端存储,小端就是小端存储。

大端(存储):是指数据的低位存在内存的高地址中,而数据的高位,存在内存的低地址

中。

小端(存储):是指数据的低位存在内存的低地址中,而数据的高位,存在内存的高地

址中。

举例:

10的16进制为a,应为00 00 00 0a,但在内存中却是0a 00 00 00. 所以可以看出我们当前编译器采取的是小端存储。

如何用代码来证实是小端存储呢?

1的16进制为:

这是小端和大端存储的两种方式,我们可以用字符指针来访问一个字节(编译器可能会有警告,这个警告没关系),如果是1,就是小端存储,如果是0,就是大端存储。

结果和我们设想的一致。


总结


这个系列的文章比较难理解,希望我们都能多用自己的思维去理解记忆,这样会好理解一些。

本篇文章内容结束,感谢大家观看。如果意见或建议,可以在评论区留言,您的点赞是我更新的动力。我们下篇文章再见。

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