数据的表示和存储1

news2024/11/23 16:32:41

目录

数制和编码

信息的二进制编码

数值数据的表示

进制计数制

 定点数和浮点数

 定点数的编码表示

原码表示

补码表示

求特殊数的补码

求真值的补码

求补码的真值

移码表示Excess (biased) notiion

 C语言中的整数

无符号整数(unsigned integer)

带符号整数(Signed integer)

C语言中的整数

个人总结


数制和编码

信息的二进制编码

 1、机器级数据分两大类

  • 数值数据:无符号整数,带符号整数、浮点数(实数)
  • 非数值型数据:逻辑数(包括位串)、西文字符和汉字

2、计算机内部所有信息都用二进制(即:0和1)进行编码

3、用二进制编码的原因

  • 制造二个稳态的物理器件容易(电位高/低、脉冲有/无、正/负极)
  • 二进制编码、计数、运算规则简单
  • 正好与逻辑命题真/假对应,便于逻辑运算
  • 可方便的用逻辑电路实现算术运算 

4、真值和机器数

  • 机器数:用0和1编码的计算机内部的0/1序列
  • 真值:真正的值,即:现实中带正负号的数

例: unsigned short型变量x的真值是127,其机器数是多少 ?127=27-1,其机器数为0000 0000 0111 1111

数值数据的表示

数值数据表示的三要素:进位计数制、定、浮点表示、如何用二进制编码,即要确定一个数值数据的值必须确定这三个要素。

例如:20137564的值是多少?答案是:不知道,因为这个数可以是十进制、也可以是8进制、16进制

1、进位计数制

  • 二进制、十进制、八进制、十六进制及其相互转换

2、定/浮点表示(解决小数点问题,因为机器数中没有小数点的表示)

定点整数、定点小数

浮点数(可以用一个定点小数和一个定点整数表示一个浮点数(科学计数法))

3、定点数的编码(解决正负号的问题)

原码、反码、补码、移码(反码很少用)

进制计数制

(1)R进位计数制

  •  八进制/ 十六进制是二进制的简便表示。便于阅读和书写!它们之间对应简单,转换容易。
  • 在机器内部用二进制表示,在屏幕或其他设备上表示时,转换为八进制/十六进制数,可缩短长度。

  八进制:Octal (用后缀“O”表示)
  十六进制:Hexadecimal (用后缀“H”,或前缀“0x”表示)

  • 现代计算机系统多用十六进制表示机器数

(2)十进制数和R进制数之间的转换

整数——“除基取余,上右下左”    小数——“乘基取整,上左下右”

(3) 十进制数与二进制数之间的转换


整数----“除基取余,上右下左” 小数----“乘基取整,上左下右”
其实,这里就出现了一个问题,小数点在计算机中怎么表示?

(4) 十进制数与八进制数之间的转换


整数----“除基取余,上右下左” 小数----“乘基取整,上左下右”
(可能小数部分总得不到0,此时得到一个近似值 )

上面的数制转换过程中,出现小数时,有时候无法转换为确切的对应的数值,比如二进制乘以小数一直无法得到整数,这说明一个问题:现实中的精确值可能在机器内部无法用0和1精确表示

 定点数和浮点数

 定点数的编码表示

原码表示

正号用0表示,负号用1表示,数值部分不变

DecimalBinaryDecimalBinary
00000-01000
10001-11001
20010-21010
30011-31011
40100-41100
50101-51101
60110-61110
70111-71111

容易理解,但是:

  • 0的表示不唯一,故不利于程序员编程
  • 加,减运算方式不统一
  • 需额外对符号位进行处理,故不利于硬件设计
  • 特别当a<b时,实现a-b比较困难

补码表示

模运算(modular运算):计算机是一个模运算系统

重要概念:在一个模运算系统中,一个数与它除以“模”后的余数等价

          时钟是一种模12系统 
  假定钟表时针指向10点,要将它拨向6点, 则有两种拨法: 
      ①倒拨4格:10-4 = 6
      ②顺拨8格:10+8 = 18 ≡ 6(mod 12) 
  模12系统中: 10-4 ≡10+8(mod 12)         -4 ≡8(mod 12)    
  则,称8是-4对模12的补码(即:-4的模12补码等于8)。
  同样有-3 ≡9(mod 12) -5 ≡ 7(mod 12)等

结论1:一个负数的补码等于模减该负数的绝对值

结论2:对于某一确定的模,某数减去小于模的另一数,总可以用该数加上另一数负数的补码来代替。(减法统一成加法)

补码的表示

补码(modular运算):+和-的统一

  • 结论1:一个负数的补码等于将对应正数补码,各位取反,末位加1
  • 运算器适合用补码表示和运算

        运算器只有有限位,假设为n位,则运算结果只能保留低n位,故可看成是个只有n档的二进制算盘,因此,其模为2^n

        当n=4时,共有16个机器数,0000~1111,可看成是模为2^4的钟表系统。真值的范围为-8~+7

补码的定义:[X]补 = 2^n+X (-2^n<=x<2^n,mod 2^n),其中X是真值,[x]补是机器数

求特殊数的补码

其中对应于上面的一条结论,一个负数的补码等于模减去该负数的绝对值 

变形补码的表示

补码定义:[X]补 = 2^n+X  (-2^n<=X<2^n, mod 2^n)

  • 正数:符号位(sign bit)为0,数值部分不变
  • 负数:符号位为1,数值部分,“各位取反,末位加1”
  • +0和-0表示唯一

求真值的补码

求补码的真值

移码表示Excess (biased) notiion

 C语言中的整数

无符号整数(unsigned integer)

带符号整数(Signed integer)

 

 其中,多一个最小负数,是因为原码中的+0和-0是不一样的,但是补码是一样的,这里节省下一个表示可以多表示一个1开头的数字,用来表示最小负数

C语言中的整数

无符号数:unsigned int(short/long);带符号数:int(short/long)常在一个数的后面加一个"u"或“U”表示无符号数

若同时有无符号数和带符号数,则C编译器会将带符号数强制转换为无符号数

例如:

例2:

//考虑以下C代码: 
	int x = –1; 
	unsigned u = 2147483648; 
	printf ( “x = %u = %d\n”, x, x); 
	printf ( “u = %u = %d\n”, u, u); 
//在32位机器上运行上述代码时,它的输出结果:
// x = 4294967295 = –1
// u = 2147483648 = –2147483648 
  • 因为-1的补码整数表示为“111...1”,作为32位无符号数解释时,其值为2^32-1 = 4294 967 296 -1=4294967295
  • 2^31的无符号数表示为“100...0”,被解释为32位带符号整数,其值为最小负数:-2^(32-1)= -2^31 = -2147483648

编译器处理常量时默认的类型

  • C90(C89和C90没什么区别)
范围类型
0 ~ 2^31-1int
2^31 ~ 2^32-1unsigned int
2^32 ~ 2^63-1long long
2^63 ~ 2^64-1unsigned long long
  • C99
范围类型
0 ~ 2^31-1int
2^31 ~ 2^32-1unsigned int
2^32 ~ 2^63-1long long
2^63 ~ 2^64-1unsigned long long

个人总结

Q&A
Q1: 在有些32位系统上,C表达式-2147483648 < 2147483647的执行结 果为false。Why?
A1: 在ISO C90标准下,2147483648为unsigned int型,因此 “-2147483648 < 2147483647”按无符号数比较, 10……0B比01……1B大,结果为false。在ISO C99标准下,“-2147483648 < 2147483647”按带符号整数比较, 10……0B比01……1B小,结果为true。

Q2: 若定义变量“int i=-2147483648;”,则“i < 2147483647”的执行 结果为true。Why?
A2: i < 2147483647 按int型数比较,结果为true。

Q3: 如果将表达式写成“-2147483647-1 < 2147483647”,则结果会怎 样呢?Why?
A3: -2147483647-1 < 2147483647 按int型比较,结果为true。

计算机是一个模运算系统

任何的数在计算机中都是一串01序列,我理解的不同的表示方式比如原码和补码都是机器根据不同的规则进行01序列的解释得到不同的真值,使用补码是为了克服原码带来的种种问题,比如0表示不唯一,+和-运算不统一的问题。

C语言中的常量不同的标准对应的数值范围默认可能是无符号的也可能是带符号的,需根据标准确定,对于带符号表示的时候,比较时,不需要考虑符号位,只要是0符号,就是比1符号位大, 如果符号一样,就考虑后面的二进制序列的大小(负数也一样)。

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

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

相关文章

QT sql查询模型,视图显示

SQL模型定义定义sql查询模型查询设置格式创建视图并显示setHeaderData() 函数定义 SQL 查询模型&#xff08;QSqlQueryModel&#xff09;是 Qt 提供的一种数据模型&#xff0c;用于执行 SQL 查询并返回结果集。它继承自 QSqlTableModel 类&#xff0c;可以使用 QSqlQuery 对象执…

【eXtplorer】本地搭建免费在线文件管理器并实现在外远程登录

文章目录1. 前言2. eXtplorer网站搭建2.1 eXtplorer下载和安装2.2 eXtplorer网页测试2.3 cpolar的安装和注册3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置4.公网访问测试5.结语1. 前言 通过互联网传输文件&#xff0c;是互联网最重要的应用之一&#xff0c;无论是网上…

springboot学习2

一、spring boot自动装配原理 pom.xml spring-boot-dependencies 核心依赖在父工程中 在写或者引入一些spring boot依赖的时候&#xff0c;不需要指定版本&#xff0c;因为有这些版本仓库启动器 <dependency><groupId>org.springframework.boot</groupId>&…

使用golang实现日志收集系统的logagent

整体架构 参考 七米老师的日志收集项目 主要用go实现logagent的部分&#xff0c;logagent的作用主要是实时监控日志追加的变化&#xff0c;并将变化发送到kafka中。 之前我们已经实现了 用go连接kafka并向其中发送数据&#xff0c;也实现了使用tail库监控日志追加操作。 我们…

【Java基础】反射详述简单模拟SpringMVC

&#x1f6a9; 本文已收录至专栏&#xff1a;JAVA基础 &#x1f44d;希望能对你有所帮助 一.概述 反射是指对于任何一个Class类&#xff0c;在运行的时候都可以直接得到这个类全部成分&#xff0c;使得我们可以动态操作Java代码&#xff0c;同时反射也破坏了Java的封装性。 例…

如何清理电脑缓存,分享4个简单方法!

案例&#xff1a;如何清理电脑缓存 【朋友们&#xff01;我感觉我电脑的内存已经严重不足了&#xff0c;想清理下电脑的缓存释放空间&#xff0c;却不知如何清理&#xff0c;大家有什么好的方法吗&#xff1f;】 经常使用电脑的朋友可能都会发现&#xff0c;好像我们没下载什…

平台和编译器决定 char 是 signed char 或者 unsigned char

平台和编译器决定 char 是 signed char 或者 unsigned charThe C and C standards allows the character type char to be signed or unsigned, depending on the platform and compiler. Most systems, including x86 GNU/Linux and Microsoft Windows, use signed char, but …

NetCore3.1或Net6.0项目升级到Net7.0

其实与我之前发布的步骤基本一致&#xff0c;升级到net6.0之后&#xff0c;在升级net7.0基本没有可修改的代码&#xff0c;只是升级一些nuget包而已&#xff0c;NetCore3.1升级到Net6.0&#xff0c;可参考此文章&#xff1a;NetCore3.1项目升级到Net6.0_csdn_aspnet的博客-CSDN…

Rust China Conf 2023 筹备启动:议题征集开始

大会介绍Rust China Conf 2023 由 Rust 中文社区发起主办、知名企业和开源组织联合协办&#xff0c;是年度国内规模最大并唯一的 Rust 线下大型会议&#xff0c;深受 Rust 中文社区开发者与相关企业的喜爱与推崇。本次大会为线下会议&#xff0c;将于6月17日-18日在上海举办&am…

Java虚拟机总结

前言 Java是目前用户最多、使用范围最广的软件开发技术之一。Java的技术体系主要由支撑Java程序运行的虚拟机、提供各开发领域接口支持的Java APl、,Java编程语言及许多第三方Java框架&#xff08;如Spring、Struts等&#xff09;构成。在国内&#xff0c;有关Java APl、Java语…

【蓝桥杯嵌入式】第十四届蓝桥杯嵌入式省赛[第一场]程序设计题以及详细题解

文章目录原题展示原题分析原题题解LED相关LCD相关按键相关ADC相关定时器相关PWM输入捕获小结文章福利原题展示 原题分析 今年的第一场比赛绝对np,官方将串口直接省掉了&#xff0c;将其替换成很多小功能&#xff0c;如&#xff1a;切换计时、频率均匀变化、锁机制等等&#xff…

Angular 全屏后选择器 (nz-select) 下拉选项框失效【开发笔记】

问题&#xff1a;Angular 全屏后选择器 (nz-select) 下拉选择无法使用 如图&#xff1a; 相应解决方法的文章&#xff1a;https://medium.com/shahar.kazaz/adding-fullscreen-support-to-ng-zorro-a38140da676 三种解决方法&#xff1a; ① FullscreenOverlyContainer&#…

SAP中用CS20批量修改BOM应用问题处理实例

在应用中可能会遇到这样的情况&#xff0c;用户通过某个工艺或技术上的改进&#xff0c;节约了某个原料的用量&#xff0c;而这个原料可能应用在一批成品上。如果成品数量太大&#xff0c;就需要做批量的变更了。 CS20这个事务应该就是用于做BOM批量处理的&#xff0c;笔者之前…

C++基础回顾(上)

C基础回顾&#xff08;上&#xff09; 目录C基础回顾&#xff08;上&#xff09;前言关键字和标识符运算符数据类型函数类前言 C之前学过一点&#xff0c;但是很长时间都没用过&#xff0c;翻出了书从头看了一遍&#xff0c;简短地做了笔记&#xff0c;以便自己之后查看和学习…

5、存储引擎

1、查看存储引擎 查看mysql提供什么存储引擎&#xff1a; show engines;2、设置系统默认的存储引擎 查看默认的存储引擎&#xff1a; show variables like %storage_engine%; #或 SELECT default_storage_engine;修改默认的存储引擎 如果在创建表的语句中没有显式指定表的存…

教你精通Java语法之第十二章、递归

目录 一、递归 1.1递归的概念 1.1.1定义 1.1.2原理 1.1.3思路 1.2单路递归 1.2.1阶乘 1.2.2正向输出数字 1.2.3反向输出字符串 1.3多路递归 1.3.1斐波那契数列 1.3.2兔子问题 1.3.3青蛙爬楼梯 1.4汉诺塔问题 1.5猴子吃桃问题 1.6老鼠走迷宫问题 二、递归的时…

从视频中截取gif怎么弄?三步简单完成视频转gif制作

电影、电视剧等短视频充斥着我们的生活&#xff0c;很多小伙伴会将这些视频中的有趣画面提取出来做成Gif动画表情包。那么&#xff0c;怎么才能从视频中提取gif动画呢&#xff1f; 一、使用什么工具才能从视频中提取gif呢&#xff1f; 通过使用GIF中文网这款专业的视频转gif&…

RabbitMQ (工作队列:Work Queues)

本章目录&#xff1a; 什么是Work Queues模拟场景&#xff0c;使用Work Queues官网文档&#xff1a;RabbitMQ tutorial - Work Queues — RabbitMQ 一、何为Work Queues 我们先看下它的结构图 显然&#xff0c;它与入门案例相比只是多了几个消费者。 以下是官方文档说明 In …

【目标检测】目标检测遇上知识图谱:Object detection meets knowledge graphs论文解读与复现

前言 常规的目标检测往往是根据图像的特征来捕捉出目标信息&#xff0c;那么是否有办法加入一些先验信息来提升目标检测的精准度&#xff1f; 一种可行的思路是在目标检测的输出加入目标之间的关联信息&#xff0c;从而对目标进行干涉。 2017年8月&#xff0c;新加波管理大学…

Vue——插槽

目录 插槽内容与出口​ 渲染作用域​ 默认内容​ 具名插槽​ 动态插槽名​ 作用域插槽​ 具名作用域插槽​ 高级列表组件示例​ 无渲染组件​ 插槽内容与出口​ 在之前的章节中&#xff0c;我们已经了解到组件能够接收任意类型的 JavaScript 值作为 props&#xff0c;…