4 信息的表示和处理_信息存储

开头:本章研究在计算机上如何表示数字和其它形式数据的基本属性,以及计算机对这些数据执行操作的属性。

注意:这部分谈到的内存,并不是指硬件中的内存条,而是在《计算机系统漫游》章节中的:【 虚拟内存】:是对主存、磁盘、I/O设备的抽象表示

下面是书本的描述:

  • 字节(byte):大多数计算机使用8位的块,或叫做字节(byte),来作为 最小的可寻址的内存单位,而不是访问存储器中单独的位
  • 虚拟内存:把内存看作成一个非常大的字节数组。
  • 地址:内存中的每个字节都由一个唯一的数字来标识。一般是用十六进制来表示。
  • 虚拟地址空间:所有可能地址的集合。

这里是我的总结:

字节:存储空间的最小单位,描述数据占据多少空间,就用字节来数表示。大多数机器中,1个字节=8位
地址:内存中的每个字节都由一个唯一的数字来标识,成为它的地址;理解为门牌号。

疑问: 地址占不占用空间?

关于字长:平时说的32位系统、64位系统,34 跟 64 表示字长。
本节先这么理解字长:

## 推导过程
1024 = 2^10

1EB=1024PB
1PB=1024TB
1TB=1024GB

1GB = 1024MB
1MB=1024KB
1KB = 1024B

1GB = (1024 * 1024 * 1024) B = 2^30B

所以:
2^32 = 2^30 * 2^2 = 4GB
2^64 = 2^30 * 2^30 * 2^4 = 16EB

16EB = 16 * 1024 *1024*1024 = 17179869184GB

C语言数据类型中在不同字长系统下的占据字节数如下:

二进制示法太冗长,而使用十进制表示法,与位模式的互相转化很麻烦。替代的方法是:十六进制数:使用数字”0″”9″,以及字符”A””F”来表示16个可能的值。

  • 0x 或 0X 开头表示
  • 字符”A”~”F”既可以是大写,也可以是小写,至是 大小写混合

2个十六进制数字就表示一个字节:因为用4个二进制数字就可以表示1个16进制数字,因此2个十六进制=2*4=8个二进制 =1个字节

二进制转十六进制:**从右往左,每四位为一截,划分,左边不足四位,补0**
十六进制转二进制进制:分别将每个16进制分别转换成对应的二进制即可。例如 0x8A = 1000 1010
十进制转二进制:除2 取余,再反转排序
二进制转十进制:abcd.efg(2)=d20+c21+b22+a23+e2-1+f2-2+g* 2-3

对于跨越多字节的程序对象,需建立两个原则:这个对象的地址是什么?以及在内存中如何排列这些字节。

例如,假设一个类型为int的变量x的地址为 0x100,x的4字节将被存储在内存的 0x100、0x101、0x102 和 0x103 位置。
  • 大端法:高位存储在低地址
  • 小端法:低位存储在低地址

不同的系统有各自的表示规则,

两种不同排序规则下的字节序列存储如下:

关于设定好字节顺序的两种场景

网络上的数据流是字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?也就是说,当接收端收到第一个字节的时候,它是将这个字节作为高位还是低位来处理呢?发送方要根据接收方的字节排序规则,来确定字节的发送顺序

网络字节序定义:收到的第一个字节被当作高位看待,这就要求发送端发送的第一个字节应当是高位。而在发送端发送数据时,发送的第一个字节是该数字在内存中起始地址对应的字节。可见多字节数值在发送前,在内存中数值应该以大端法存放。

判断机器大小端法例子

#include
int main()
{
int a = 0x12345678;
char i = a;
printf("%x", i);
return 0;
}
定义1个十六进制的数据,数据类型为int型,再定义一个char类型的数据,int数据类型的大小为4个字节,而char类型的数据为1个字节,
因此将int类型的数据赋值给char时会丢失三个字节的数据,char类型中存储的是int类型中低地址的数据,
这时候char类型获取的数据输出以后,若是输出的是12那就说明你低地址位置的数据是12,那就说明你的数据是大端存储,若是输出的结果是78那当前条件下就是小端存储。

输出结果:78,即该 centos系统采用小端法存储

计算机系统的一个基本概念就是, 从机器的角度来看,程序仅仅只是字节序列。机器没有关于原始源程序的任何信息,除了可能有些用来帮了助调试的辅助表以外。
不同的机器类型使用不同的且不兼容的指令和编码方式。即使是完全一样的进程,运行在不同的操作系统上 也会有不同的编码规则,因此 二进制代码是不兼容的二进制代码很少能在不同机器和操作系统组合之间移植

6.1 位级运算

符号 表述 说明 ! OR & AND ~ NOT 取反 ^ EXCLUSIVE-OR 异或 位数相同得到0,位数相反得到1

举例子:

将十六进制转换成二进制并执行二进制运算后,再转回十六进制。

什么是掩码?
简单来说掩码就是一串二进制码。比如:00000101。就是个数字。掩码的作用是用来存储和操作”状态(State)”。大致用法和逻辑总结:

  • 用二进制码存储状态,
  • 通过位运算(&, |, ^, ~, >>, << 等)来操作状态。

为什么使用掩码?

为什么使用掩码其实本质是为什么使用二进制和位运算。
在计算机编程中, 直接做二进制运算——即位运算的效率更高。而且表达上更简洁。

哪里有使用?

熟悉Java的都知道,java.util.concurrent JUC工具包中,大量的类使用位级运算,保存状态或结果信息,例如AbstractQueuedSynchronizer的成员变量:state,可重入读写锁ReentrantReadWriteLock就是利用了左移右移运算,同时在高、低位存储了读/锁的状态

6.2 逻辑运算

逻辑运算符号 表述 说明 || OR 逻辑或 && AND 逻辑与 ! NOT 取反

注意:逻辑运算跟位级运算容易混淆,但是他们的功能完全不同。

6.3 移位运算

左移K位 : 按二进制形式把所有的数字向左移动K位,高位舍弃,低位的空位补零。
数字意义:在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方, 左移n位就相当于乘以2的n次方

4<<2:表示10进制4左移2位。结果:0000 0100<<2 得到:0001 0000="16" < code></2:表示10进制4左移2位。结果:0000>

也称为无符号右移。
右移K位 : 低位舍去K位,高位补上K个0

&#x5BF9;&#x53C2;&#x6570;x&#xFF1A;0110 0011 &#xFF0C;&#x903B;&#x8F91;&#x53F3;&#x79FB;4&#x4F4D;&#xFF0C;&#x7ED3;&#x679C;&#xFF1A;0000 0110

右移K位 : 低位舍去K位,高位补上K个x,这个x(符号位)是移位后最高位的那个值

&#x5BF9;&#x53C2;&#x6570;x&#xFF1A;1001 0101&#xFF0C;&#x7B97;&#x672F;&#x53F3;&#x79FB;4&#x4F4D;&#xFF0C;
&#x53F3;&#x79FB;&#x56DB;&#x4F4D;&#x540E;&#xFF1A;1001 &#xFF0C;&#x6B64;&#x65F6;&#x6700;&#x9AD8;&#x4F4D;&#x662F;1
&#x8865;&#x5145;K&#x4E2A;&#x6700;&#x9AD8;&#x4F4D;&#x503C;&#x540E;&#xFF1A;1111 1001

Original: https://www.cnblogs.com/knowledgeispower/p/16690684.html
Author: 拿了桔子跑-范德依彪
Title: 4 信息的表示和处理_信息存储

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/585086/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 缓存更新的另一种方法:双删策略

    上一篇说到缓存的更新操作是非幂等操作,会出现并发更新的问题。那用缓存删除操作实现缓存更新行不行,您可能觉得奇怪,删除了缓存如何更新,假设读业务先读取缓存,如果发现没有就回溯到读数据…

    Java 2023年6月16日
    084
  • Linux 手工释放Linux Cache Memory

    为了加速操作和减少磁盘I/O,内核通常会尽可能多地缓存内存,这部分内存就是Cache Memory(缓存内存)。根据设计,包含缓存数据的页面可以按需重新用于其他用途(例如,应用程序…

    Java 2023年6月16日
    086
  • java基础–高内聚与低耦合

    模块 模块是从逻辑上将系统分为更细微的部分,将复杂的问题拆成多个简单的问题,逐个解决耦合主要描述模块之间的关系、内聚主要描述的是模块的内部。模块的粒度可大可小,可以是函数、类、功能…

    Java 2023年6月8日
    0107
  • Excel作为数据源的调用方法与数据文件说明

    感谢各位对我们规划平台的支持,对于小伙伴们提出的宝贵建议我们会收集起来,整理成改进清单。基于这个清单实现并发布对应的功能。这新发布的具有通用性的功能都会纳入我们的通用版本中。选择了…

    Java 2023年6月16日
    072
  • Javaweb-JSP详解

    一、什么是JSP Java Server Pages:Java服务器端页面,和Servlet一样,用于动态web技术 最大的特点: 写JSP就像在写HTML 区别: HTML只给用…

    Java 2023年6月13日
    070
  • Word书签替换,加盖电子印章及转换PDF(Java实用版)

    一、前言 在项目中有需要对word进行操作的,可以看看哈,本次使用比较强大的spire组件来对word进行操作,免费版支持三页哦,对于不止三页的word文件,可以购买收费版,官网:…

    Java 2023年6月8日
    082
  • 从芒果分装角度—看MapReduce流程

    有一芒果产销基地,园区内有芒果种植园(产), 芒果分装库(装),芒果销路(销)。芒果种植园即HDFS中的文件,这个种植园规模很大,有不同的山头,假设一个山头一个分区。芒果的品质不同…

    Java 2023年6月8日
    0118
  • 基于协同过滤算法实现选课推荐系统

    1.系统功能 1、用户账户管理2、学生个人信息的查看与修改3、学生的网上选课与课程的评分4、教师个人信息的查看与修改5、教师对学生课程评价结果的查看6、管理员对学生信息与教师信息的…

    Java 2023年6月8日
    0165
  • 卸载docker及其镜像方法+docker搭建代码质量检测平台sonarqube+maven方式扫描java代码

    Sonar 是一个用于代码质量管理的开源平台,用于管理源代码的质量 通过插件形式,可以支持包括 java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groov…

    Java 2023年6月13日
    091
  • java 学习资料集合

    原始数据类型与字长 见附件文档。 流程控制语句 异常体系 类/接口/枚举 线程体系结构 文件/流体系结构/NIO 正则表达式 GC原理 JDBC/SQL注入 Java安全类库/安全…

    Java 2023年5月29日
    068
  • C# RSA和Java RSA互通

    今天调查了C# RSA和Java RSA,网上很多人说,C#加密或者java加密 ,Java不能解密或者C#不能解密 但是我尝试了一下,发现是可以的,下面就是我尝试的代码,如果您有…

    Java 2023年5月29日
    087
  • Spring Cloud Gateway 请求报文获取 高性能实现方法

    1 简介 本文使用的spring cloud版本:2020.0.1 关于Spring Cloud Gateway报文获取,网上写法较多参考ModifyRequestBodyGate…

    Java 2023年5月30日
    073
  • Java中 List、Set、Map 之间的区别

    一、List(列表) List的元素以线性方式存储,可以存放重复对象,List主要有以下两个实现类: ArrayList : 长度可变的数组,可以对元素进行随机的访问,向Array…

    Java 2023年5月29日
    076
  • 利用JVM钩子函数优雅关闭线程池

    核心API: shutDown shutDownNow awaitTermination 利用JVM钩子函数,在虚拟机关闭时调用相关方法即”优雅关闭线程池”…

    Java 2023年6月6日
    087
  • Idea的Debug

    来自CSDN:https://blog.csdn.net/yxl_1207/article/details/80973622 Original: https://www.cnblo…

    Java 2023年6月8日
    060
  • JAVA入门[23]-SpringBoot配置Swagger2

    一、新建SpringBoot站点1.新建module,然后引入pom依赖: 2.新建Controller文件 3.新建SpringBoot启动文件 4.运行,http://loca…

    Java 2023年5月29日
    087
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球