当前位置: 首页 > news >正文

数据在计算机内的表示和存储

目录

一.C语言中强制类型转换

二.数据的存储方式

1.大小端模式

2.边界对齐


一.C语言中强制类型转换

1.无符号数与有符号数:不改变数据内容,只是改变了计算机的解释方式

例如下图,短整型转为无符号短整型再赋值给y,y=x=1110 1111 0001 1111,只是计算机在解析真值时会以无符号数的规则进行解析。

2.将长整型变短整型:则将高位截断,保留低位。

例如下图,a用16进制表示为0x000286a1,强制类型转换后为0x86a1,即c=0x86a1,计算机用16bit补码的方式将其解析为真值,即-31071。b转换为d同理:

3.短整数变长整数:符号扩展

① 有符号数

由于定点整数的小数点在数的末尾,所以,若定点整数的补码是负数,则在符号位和原有的数值位之间填充“1”(正数则填充“0”),用这样的方式得到的补码,解析为真值,值是不变的。

例如下图,短整型x转换为长整型n,由于x是负数,所以在符号位后填充"1"

再看n,将短整型强制转换为无符号短整型,再赋值给n。这时计算机会把x的二进制值赋值给n,再以无符号数的规则解析出真值。

② 无符号数:若原数字是无符号数,扩展后高位用0填充。

例如下图,将无符号短整型n转换为无符号整型p,高位填充"0"即可。

二.数据的存储方式

1.大小端模式

对于某个4字节的int变量:0123 4567H,其最高有效字节(MSB)为01(1个字节8bit),最低有效字节(LSB)为67。多字节数据在内存里一定是占连续的几个字节的,根据数据在内存中的存储方式不同,可以分为大端方式和小端方式

大端方式:更高的有效字节存到更低地址中,这样的存储方式便于人类阅读。

下图所示的0800H,0801H指的是内存地址:

小端方式:更低的有效字节存到更低地址中,便于机器的处理。机器读多字节数据时是从低地址读到高地址的,采用小端方式,最先读到的是67。当CPU对两个int型变量进行加法操作的时候,也是应该先从最低有效字节进行加法。

2.边界对齐

现代计算机通常是按字节编址,即每个字节对应1个地址。通常也支持按字、按半字、按字节寻址:假设存储字长为32位,则1个字=32bit,半字=16bit。每次访存只能读/写1个字(也就是读取一整行,不能跨行读取)

无论是按半字还是字寻址,字地址,半字地址最终都要转化为字节地址。

这里1个字=4个字节,当给出了要访问的数据的字地址时,怎么将其转化为与之对应的字节地址:只需要将字地址逻辑左移两位即可,因为逻辑左移1位表示*2,逻辑左移两位表示*4。例如要访问2号字,2的二进制表示为10,逻辑左移两位后得到:1000(8),所以2号字的其实地址就是8号字节。半字地址的操作同理,只需要逻辑左移一位即可。

有的计算机会采取数据边界对齐的方式:

而有的计算机中会采取边界不对齐的方式:

例如,c语言中,char占1个字节,short占两个字节,int占4个字节。现在定义一个结构体,这个结构体包含3个char型变量,3个short型变量和1个int型变量。

对于对齐方式而言,当存储完3个char型变量后,会剩下1个字节的空间,这1个字节的空间不足以存放short和int,所以这个字节的空间不会存放任何数据。

对于不对齐的方式而言,存储完3个字节后,可以将第4个字节的空间用于存放short型变量的第1个字节,将第2行的第1个字节的空间用于存放short型变量的第2个字节。

总结:

如果利用不对齐的方式存储数据,当读出这个short型变量时,需要进行2次访存。只有将两个字的内容都读入,并且将第一行short的内容和第二行short的内容进行拼接,才能得到short型变量的完整表示。

而采用对齐方式存储数据,虽然存在一些空间的浪费,但是读入short型变量时,只需要进行1次访存。因为这个变量的所有数据都只存放在1个字中。

相关文章:

  • 哈夫曼树的构造,哈夫曼树的存在意义--求哈夫曼编码
  • 【安卓跨进程通信IPC】-- Binder
  • 简易图像处理器的设计
  • ChatGLM3-6B部署
  • Python代码关系图生成,帮助快速熟悉一个项目
  • Vue.js的核心概念:如何理解Vue.js的声明式渲染、组件系统、Vue实例、Vue生命周期等核心概念。
  • 机器学习实战项目一(卡通化图像)
  • Linux命令篇(一):文件管理部分
  • 阿里云短信服务使用(Java)
  • C# 语言类型(二)—预定义类型之字符串及字符类型简述
  • 深入理解Java中的List集合:解析实例、优化技巧与最佳实践
  • HackTheBox-Machines--Lazy
  • 数据结构——图
  • Lua的几个特殊用法
  • PHP面向对象编程总结
  • [deviceone开发]-do_Webview的基本示例
  • 【刷算法】从上往下打印二叉树
  • JavaScript标准库系列——Math对象和Date对象(二)
  • JDK 6和JDK 7中的substring()方法
  • js
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • MaxCompute访问TableStore(OTS) 数据
  • PHP那些事儿
  • php中curl和soap方式请求服务超时问题
  • 彻底搞懂浏览器Event-loop
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 分布式事物理论与实践
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 前端攻城师
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 新书推荐|Windows黑客编程技术详解
  • 应用生命周期终极 DevOps 工具包
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • 正则表达式-基础知识Review
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • ​油烟净化器电源安全,保障健康餐饮生活
  • (3)llvm ir转换过程
  • (55)MOS管专题--->(10)MOS管的封装
  • (C语言)共用体union的用法举例
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (二)Linux——Linux常用指令
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (四)库存超卖案例实战——优化redis分布式锁
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转)Scala的“=”符号简介
  • (转)四层和七层负载均衡的区别
  • (轉)JSON.stringify 语法实例讲解
  • .apk文件,IIS不支持下载解决
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .NET CLR基本术语
  • .net core控制台应用程序初识
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET 解决重复提交问题