浅谈C语言整型类数据在内存中的存储

1、整型类数据

C语言中的整型类数据都归类在整型家族中,其中包括:char、short、int、long、long long这5个大类,而每个大类中又分为两类signed和unsigned,这些都是C语言中的内置类型。以下重点基于char和int这两种类型的数据进行阐述,其余数据类型以此类推。

A、char:signed char 和unsigned char

首先,就char本身而言,它是signed char还是unsigned char呢?这个其实是与编译器有关的。对于VS编译器,乃至C语言大部分编译器,char都是默认为signed char。

(特别说明,char默认为signed char 这个是编译器决定的,对于C语言自身而言,却是标准未定义的。在这点上,其它类型的整型类数据与char不同,在未标明unsigned的情况下,默认为signed类型,这个是C语言自身定义的)

以下对signed char和unsigned char 分别进行讨论。

a、signed char

signed char 中文名为有符号字符型。

signed char 在内存中大小为1个字节,8个比特位,即八位二进制,其中最高位为符号位--1表示负,0表示正。

整型类数据在内存中存储的是补码,因而下面基于补码来对signed char进行讨论。

signed char的范围是:-128 到127 。为什么呢?

首先,signed char在内存中的大小为8个比特位,我们看一下这八位二进制的情况。

八位二进制:(考虑补码)

00000000/00000001/....../01111111/10000000/10000001/....../11111110/11111111

八位二进制补码总共有这么多种情况,下面进行补码向原码的转换,分为以下三种情况:

1、符号位为0。符号位为0,也就是正整数和0,原反补相同,因而这些二进制的实际范围即0-127

2、符号位为1。符号位为0,也就是负整数,因而将二进制补码转化为原码后,得到的实际范围即-1到-127。

3、10000000。这个二进制补码比较特殊,考虑到符号位为1,如果进行正常的补码向原码转化

,得到的是100000000,共9个比特位,显然溢出了,如果截断的话,得到00000000,实际值为0,这显然与补码为00000000的时候重复了。因而,C语言特别规定,对于signed char,存储补码为10000000时,实际值为-128。

由此,我们得到了signed char的范围:-128至127。

所以,如下的代码便可以得到很好的解释:

我们可以直接基于补码进行理解:

a的补码为01111111

b为a+1,那么直接a的补码加1,得到10000000,所以b就是-128

c为b+1,那么直接b的补码加1,得到10000001,相应原码为11111111,所以c就是-127

d为c-2,那么直接c的补码减2,得到01111111,所以d就是127

注:补码的运算实际上将符号位与数值位的相统一,因而具体运算时不再区分符号位与数值位,统一按数值位进行运算

具体输出结果为:

b、unsigned char

unsigned char在内存中占一个字节,八个比特位,八位二进制均为数值位。因为是无符号类型,或者说理解为正数,所以原反补相同。

考虑八位二进制情况:

00000000/00000001/....../10000000/....../11111110/11111111

原反补相同,因而最终得到的unsigned char的范围为:0-255

此时,如果存储整型类数据大小大于一个字节,则自动低位截断。可见下例:

a的补码为11111111,补码加1后得到100000000,共9个比特位,溢出了,故存储时进行低位截断,因而实际存储到b中的补码为00000000,实际值为0,因而最终的输出结果为0。

B、int

int分为两类:signed int 和unsigned int 。int默认为是signed int。

a、signed int

同signed char相同,signed int 最高位为符号位,整体大小为4个字节,32个比特位,因而数值位共31位。

考虑signed int 的补码二进制情况:

00000000000000000000000000000000

00000000000000000000000000000001

10000000000000000000000000000000

1111111111111111111111111111111111110

1111111111111111111111111111111111111

所以也可分为三种情况:

1、符号位为0。此时即为正整数和0的情况,原反补相同,实际的数值范围为:0至2^31-1

2、10000000000000000000000000000000。C语言规定,此补码对应的实际数值为负的2^31

3、符号位为1.此时即为负整数的情况,补码向原码转化后,得到的实际数值范围为:负的2^31至-1

其中具体的运算与signed char类似,在此不多做赘述。

b、unsigned int

unsigned int 为无符号整型,大小为4个字节,32个比特位均为数值位,且原反补相同。

因此unsigned int的取值范围为:0至2^32-1

2、大小端【字节序】存储

我们知道,整型类数据在内存中存储的是补码,补码是二进制的形式,那么这个补码具体是怎样存储的呢?这样就涉及到大小端字节序存储的问题。

首先,我们要明确一点,因为大小端字节序存储是以1个字节为单位来讨论存储顺序的问题,因而只对内存大小大于等于2个字节的数据有意义,而对于char类型的数据是没有意义的(char类型的数据在内存中只占一个字节,因而无所谓顺序问题)

A、大端【字节序】存储

在这种存储方式下,低二进制位放在高地址处,高二进制位放在低地址处。

以下举个例子:

现在有一个数0x11223344    现在用大端【字节序】存储方式对此数据进行存储

低地址           ————>>>            高地址

   11     22     33     44

这就是该数据的存储方式,符合规则:低二进制位放在高地址处,高二进制位放在低地址处。

B、小端【字节序】存储    

在这种存储方式下,低二进制位放在低地址处,高二进制位放在高地址处。

VS中,整型类数据的存储方式便是用小端【字节序】存储

我们对这段代码进行调试,并打开内存窗口进行观察

可以清楚地看到,低二进制位放在低地址处,高二进制位放在高地址处

特别注明,内存中存储的补码本质上是二进制的形式,只不过在显示时,为了显示的方便,用十六进制的形式进行显示(4个二进制位等同于1个十六进制位)

当然,我们也可以写一段代码来检验是大端字节序存储还是小端字节序存储。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/49604.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++学习笔记-C++11中的智能指针

1.智能指针介绍 智能指针是C的特性用法,是一个类似指针功能的类对象,其目的是为了更好的管理动态分配的内存,避免出现内存泄漏、悬空指针等问题。C11的标准库里提供了三种智能指针模板类,分别是std::unique_ptr、std::shared_ptr…

苹果笔记本电脑如何优化系统 苹果电脑系统优化软件哪个好 cleanmymac x怎么用

随着时间的推移,你可能会发现你的MacBook运行速度变慢,甚至在执行一些基本任务时也会感觉到卡顿。这不仅影响了工作效率,也大大降低了使用体验。但别担心,优化你的Mac系统比做早餐还简单。本文将用一种轻松的风格向你介绍7种简单易…

函数的介绍

目录 一、函数介绍 1、函数的介绍 2、自定义函数 3、函数的好处 二、函数的定义 1、函数的定义 2、函数的调用 3、快速入门案例 三、函数-调用机制 1、函数-调用过程 2、return语句 一、函数介绍 1、函数的介绍 1)为了完成某一功能的程序指令(语句)的集…

【Postgres实战】Postgres的角色权限本地/在线不一致?

背景 Gin-Vue-Admin是开源的全栈开发平台,可以担任企业内部后台管理的职责。官网地址是:gin-vue-admin | GVA 文档站。上图为在线demo展示页面。 它的后台使用Golang(The Go Programming Language (google.cn)),基于…

JSON 文件第一段飘红

问题 原因 这个问题通常发生在尝试用 ESLint 去解析 JSON 文件时。ESLint 主要设计用于检查 JavaScript 代码的语法和风格,而JSON是一种数据交换格式,不包含 JavaScript 的逻辑结构,如函数、变量声明等。 解释报错原因 当ESLint遇到它不能识…

让 AI 开发更高效、低成本,DigitalOcean 公布 GPU Droplet 云主机产品

全球知名云服务供应商 DigitalOcean 在近期举行的 Deploy 大会上公布了全新的 GPU Droplet 云主机服务,这标志着DigitalOcean 在支持AI和机器学习工作负载方面迈出了重要一步。 DigitalOcean 的 GPU Droplet(云主机) DigitalOcean 自 2023 …

【STM32嵌入式系统设计与开发拓展】——12_Timer(定时器中断实验)

目录 1、什么是定时器?定时器用于测量时间间隔,而计数器用于计数外部事件的次数 2、定时器的主要功能和用途?3、定时器类型?4、定时器的编写过程5、代码分析定时器计算? 1、什么是定时器? 定时器就是计数器…

正点原子STM32(基于HAL库)6

目录 TFTLCD&#xff08;MCU 屏&#xff09;实验TFTLCD 简介TFTLCD 简介液晶显示控制器FSMC 简介FSMC 关联寄存器简介 硬件设计程序设计FSMC 和SRAM 的HAL 库驱动程序流程图程序解析 下载验证 LTDC LCD&#xff08;RGB 屏&#xff09;实验RGBLCD<DC 简介RGBLCD 简介LTDC 简介…

力扣高频SQL 50题(基础版)第九题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第九题197. 上升的温度题目说明思路分析实现过程准备数据实现方式结果截图总结 力扣高频SQL 50题&#xff08;基础版&#xff09;第九题 197. 上升的温度 题目说明 Weather ---------------------- | Column Name…

深度学习实战笔记2实战Kaggle比赛:预测房价

此数据集由Bart de Cock于2011年收集 :cite:De-Cock.2011&#xff0c; 涵盖了2006-2010年期间亚利桑那州埃姆斯市的房价。 这个数据集是相当通用的&#xff0c;不会需要使用复杂模型架构。 它比哈里森和鲁宾菲尔德的波士顿房价 数据集要大得多&#xff0c;也有更多的特征。 1下…

数据结构之深入理解简单选择排序:原理、实现与示例(C,C++)

文章目录 一、简单选择排序原理二、C/C代码实现总结&#xff1a; 在计算机科学中&#xff0c;排序算法是一种非常基础且重要的算法。简单选择排序&#xff08;Selection Sort&#xff09;作为其中的一种&#xff0c;因其实现简单、易于理解而受到许多初学者的喜爱。本文将详细介…

El-Table 表格的表头字段切换

最近写了一个小功能&#xff0c;比较有意思&#xff0c;特此博客记录。 提出需求&#xff1a;需要表头字段变化&#xff0c;但是我在官网上的表格相关上查找&#xff0c;没有发现便捷方法。 于是我有两个想法&#xff1a;1.做三个不同的表格。2.做一个表格使用不同的表头字段。…

python如何调用matlab python package库matlab转python安装包调用使用简单示例

说明(废话) 之前没有进行python调用过matlab&#xff0c;前面用matlab engine for python可以通过调用matlab的源码文件的形式可以调用工程&#xff0c;但是这又有一个问题&#xff0c;就是在运行的时候必须提供python和matlab的全部源码 该文章是通过matlab源码转python pack…

cdp碳信息披露

在全球化日益加深的今天&#xff0c;环境保护和可持续发展已成为全球共识。企业作为经济社会的主体&#xff0c;其在环保领域的行动和决策不仅影响着自身的发展&#xff0c;更对整个社会乃至全球的生态环境产生深远影响。CDP&#xff08;Carbon Disclosure Project&#xff0c;…

很酷的仿真翻页书HTML源码,书本页面是加载的图片,基于JQuery实现的翻页特效,结合一些js插件,看起来很酷,在实现在线翻书项目。

仿真翻页书HTML源码https://www.bootstrapmb.com/item/14742 创建一个仿真的翻页书效果在HTML和CSS中可以通过多种方式实现&#xff0c;但通常这也会涉及到JavaScript&#xff08;或jQuery&#xff09;来处理交互和动画。以下是一个简单的示例&#xff0c;展示如何使用HTML、…

【Leetcode】十八、动态规划:不同路径 + 全1的最大正方形

文章目录 1、动态规划2、leetcode509&#xff1a;斐波那契数列3、leetcode62&#xff1a;不同路径4、leetcode121&#xff1a;买卖股票的最佳时机5、leetcode70&#xff1a;爬楼梯6、leetcode279&#xff1a;完全平方数7、leetcode221&#xff1a;最大正方形 1、动态规划 只能…

10KW级电机电流特性曲线推导及校验

1.首先进行数据拟合 2.拟合曲线依照电机参数标准化 30A处转差率应为6.6%。 3.全域电流对照表&#xff1a; 4.实际的电流年变化曲线&#xff08;因为电压不稳定&#xff09; 4.1 以日为单位的电流起伏 蓝色的部分标出了工作日的切换。 4.2 某个月的电流趋势图&#xff1a;

argon主题调整日记

前言 argon主题是一款由solstice23开发的一款简洁美观的WordPress主题&#xff0c;在使用过程中也发现了几个可以优化的点&#xff0c;在查阅主题文档无果后对其进行以下几点修改。 1、使用子主题 为了避免修改源文件而引起主题更新后修改丢失的问题&#xff0c;还是尽量使用子…

C# yaml 配置文件的用法(一)

目录 一、简介 二、yaml 的符号 1.冒号 2.短横杆 3.文档分隔符 4.保留换行符 5.注释 6.锚点 7.NULL值 8.合并 一、简介 YAML&#xff08;YAML Aint Markup Language&#xff09;是一种数据序列化标准&#xff0c;广泛用于配置文件、数据交换和存储。YAML的设计目标是…

【Java 数据结构】ArrayList类介绍

ArrayList类介绍 初识List接口ArrayList类ArrayList类是什么顺序表的模拟实现初始化增加元素删除元素查找元素修改元素 ArrayList类使用构造方法ArrayList源码阅读常用方法及其注意事项 初识List接口 List 是集合框架中的一个接口, 它的里面包含了一些方法, 例如add(), remove…