深度理解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,就是大端存储。

结果和我们设想的一致。


总结


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

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

目录
相关文章
|
28天前
|
存储 C语言
【C语言基础考研向】04整型进制转换
本文介绍了计算机中整型常量的不同进制表示,包括二进制、八进制、十六进制和十进制,并解释了它们之间的转换方法。以一个32位整型数为例,展示了其在不同进制下的表示形式及计算方法,特别指出在内存观察中常用十六进制,同时提到了小端存储方式对数据的影响。
|
2天前
|
编译器 C语言 C++
【C语言】精妙运用内存函数:深入底层逻辑的探索
【C语言】精妙运用内存函数:深入底层逻辑的探索
|
1月前
|
C语言
C语言程序设计核心详解 第二章:数据与数据类型 4种常量详解 常见表达式详解
本文详细介绍了C语言中的数据与数据类型,包括常量、变量、表达式和函数等内容。常量分为整型、实型、字符型和字符串常量,其中整型常量有十进制、八进制和十六进制三种形式;实型常量包括小数和指数形式;字符型常量涵盖常规字符、转义字符及八进制、十六进制形式;字符串常量由双引号括起。变量遵循先定义后使用的规则,并需遵守命名规范。函数分为标准函数和自定义函数,如`sqrt()`和`abs()`。表达式涉及算术、赋值、自增自减和逗号运算符等,需注意运算符的优先级和结合性。文章还介绍了强制类型转换及隐式转换的概念。
|
10天前
|
缓存 NoSQL 算法
14)Redis 在内存用完时会怎么办?如何处理已过期的数据?
14)Redis 在内存用完时会怎么办?如何处理已过期的数据?
20 0
|
11天前
|
存储 弹性计算 网络协议
阿里云ECS内存型实例规格族特点、适用场景、指标数据参考
阿里云ECS提供了多样化的内存型实例规格族,专为需要高性能内存资源的应用场景设计。从最新的r8a系列到经过优化的re6p系列,旨在提供稳定、高效且安全的计算环境。这些实例不仅具备强大的计算性能与内存配比,还通过支持ESSD云盘和高效网络协议,显著提升了存储I/O能力和网络带宽,适用于大数据分析、高性能数据库、内存密集型应用等多种场景,为用户带来卓越的计算体验。本文将详细解析阿里云ECS中的多个内存型实例规格族,包括它们的核心特点、适用场景、实例规格及具体指标数据,为用户在云计算资源选型时提供参考。
|
1月前
|
缓存 Linux C语言
C语言 多进程编程(六)共享内存
本文介绍了Linux系统下的多进程通信机制——共享内存的使用方法。首先详细讲解了如何通过`shmget()`函数创建共享内存,并提供了示例代码。接着介绍了如何利用`shmctl()`函数删除共享内存。随后,文章解释了共享内存映射的概念及其实现方法,包括使用`shmat()`函数进行映射以及使用`shmdt()`函数解除映射,并给出了相应的示例代码。最后,展示了如何在共享内存中读写数据的具体操作流程。
|
2月前
|
C语言
【C语言】在限制定条件下数据移动
【C语言】在限制定条件下数据移动
30 1
|
2月前
|
存储 NoSQL 程序员
C语言中的内存布局
C语言中的内存布局
41 0
|
2月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
187 0
|
3月前
|
存储 分布式计算 Hadoop
HadoopCPU、内存、存储限制
【7月更文挑战第13天】
225 14