热门标签 | HotTags
当前位置:  开发笔记 > 人工智能 > 正文

数据表达(转)

数据表达(转)--Linux通用技术-Linux编程与内核信息,下面是详情阅读。
数字表达与操作
数字表达与操作
Andrew Huang
内容提要
l 数字表示格式
l 数字移位操作
数字表示格式
首先某个基本类型占用宽度是确定的.在 32 位 CPU 下,unsigned char /char 占一个字节,
unsigned int /int 占四个字节,unsigned long /long 也是占用四个字节.
因为在内存是二进制表示的.(0,1),某一个类型的数就是内存中以二进制来表示.
以 unsigned char 型的数 18 为例.
18 (10) =00010010 (2)
在内存即用上述 00010010 表示
对于有符号数数据类型,如 int,long,short,char 等.最高位用于表示符号位.符号位上,为 0
表正数,1 表示负数
计算机如何表示负数?
l 在确定最高位符号位时,剩下位怎么来表示负数?
l 人们提出三种表示负数的方法
? 原码
? 反码
? 补码
l 在实际中,其本上是采用补码来表示负数
原码表示法
l 一种策略就是按无符号数一样,用原始的二进制数表示,这称为原码表示法.
l 原码:在数值前直接加一符号位的表示法
l [+7]原= 0 0000111 B
l [-7]原= 1 0000111 B
? 0 就有两个表达方法
l [+0]原=00000000B [-0]原=10000000B
? 8 位二进制原码的表示范围:-127~+127
原码表示法的缺点
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
数字表达与操作
l 为了运算速度和算法简洁.有符号数的运算,编程语言都是把符号位直接参加运算的.
l 带符号位的原码进行乘除运算时结果正确,而在加减运算的时候就出现了问题 .
? 正确结果
? 1 (10)- 1 (10) = 1 (10) + ( -1 )(10) = 0 (10)
? 用原码运算的结果
? (00000001)原 + (10000001)原 = (10000010)原 = ( -2 ) 显然不正确.
反码表示法
l 为解决原码的运算错误,人们提出了反码表示法
? 正数:正数的反码与原码相同。
? 负数:负数的反码,符号位为“1”,数值部分按位取反。
? 反码表示例子
l [+7]反= 0 0000111 B
l [-7] 反= 1 1111000 B
? 0 也有两种反码表示
l [+0]反=00000000B
l [- 0]反=11111111B
? 8 位二进制反码的表示范围:-127~+127
反码表示法的缺点
l 反码运算例子 1
? 1(10) - 1(10)= 1(10) + (-1)(10)= ( 0 )(10)
? (00000001) 反+ (11111110)反 = (11111111)反 = ( -0 ) 有问题.
l 反码运算例子 2
? 1(10) - 2(10) = 1(10) + ( -2 ) (10) = (-1) (10)
? (00000001) 反+ (11111101)反 = (11111110)反 = ( -1 ) 正确
l 问题出现在(+0)和(-0)上,在人们的计算概念中零是没有正负之分的 .
l
补码表示法
l 为了解决上述问题,人们最终采用补码表示法
? 正数:正数的补码和原码相同。
? 负数的补码则是符号位为“1”, 数值部分按位取反后再在末位 最低位) 1。
( 加
也就是“反码+1”。
? 例子
l [+7]补= 0 0000111 B
l [-7]补= 1 1111001 B
? 在补码中用(-128)代替了(-0),所以补码的表示范围为:(-128~0~127)共 256 个.
l (-128)没有相对应的原码和反码, (-128) = (10000000)
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
数字表达与操作
补码运算
l 补码运算例子 1
? 1(10) - 1(10)= 1(10) + (-1)(10)= ( 0 )(10)
? (00000001)补 + (11111111)补 = (00000000)补 = ( 0 ) 正确
l 补码运算例子 2
? (00000001) 补+ (11111110) 补= (11111111)补 = ( -1 ) 正确
补码运算特性
l 优点
? 使符号位能与有效值部分一起参加运算,从而简化运算规则.
? 使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计.
l 补码表示是底层实现细节.
? 在 C,汇编源代码中还是用原码表示,如-3 在源代码仍然用-3 来表示
? 但如果对数字实现位操作,如取反,左移,右移时,必须要考虑负数用补码的情

运算例子 1
l 已知原码,求补码。
? 问:已知某数 X 的原码为 10110100B,试求 X 的补码和反码。
? 解:由[X]原=10110100B 知,X 为负数。求其反码时,符号位不变,数值部
分按位求反;求其补码时,再在其反码的末位加 1。
? 故:[X]补=11001100B,[X]反=11001011B。
运算例子 2
l 已知补码,求原码。
? 问:已知某数 X 的补码 11101110B,试求其原码。
? 解:由[X]补=11101110B 知, 为负数。 其原码表示时, 求 符号位不变,
X
数值部分按位求反,再在末位加 1。
?
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
数字表达与操作
l 问:printf(“ %d”,~2)输出?
? ~是表示位取反,即这个数的每一位都由 0 变 1,1 变 0,本题问的 2 取反
后,新的有符号数的值是什么?
l 解:2 是正数 ,采用原码表示 10B,位取反就是 11111101B,这样最高位是 1
表示负数.
? 把上述数看成补码,这样减 1 后再取反就是原码
l ~(1111101B-1) = 11B,即 3
l 答:最终输出-3
简单判断一个数是否带符号位办法
#define ISUNSIGNED(v) ( (v)>=0 && ~(v)>0))
这个宏就是利用补码取反符号位也改变特性
简单判断一个类型是否带符号位的办法
#define ISUNSIGNED(type) (~((type)1)>0)
数字移位操作
数字左移时总是把高位移走和低位补零, 并且把位依次移位。 数字移位操作因为有符号
位的关系,在移位时分两种情况.数字右移时无符号数是低位移走和高数补零,并且把位依
次移位,此时称为逻辑右移;而有符号数大多数情况下,是最高位符号位不变。移走最低位和
补最高位值(也就是补最高有效位) 几位就补几位,此时称为算术右移。 ,移
标准 C 并未规定有符号位右移是采用逻辑右移还是算术左移。因此称有符号数大多数
操作系统的实现采用是算术右移。
(1)unsigned char x=3;
x<<1 是多少?x>>1 是多少?
(2)char x=3;
x<<1 是多少?x>>1 是多少?
(3)char x=-3;
x<<1 是多少?x>>1 是多少?
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
数字表达与操作
3 写成二进制数是 00000011;-3 写成二进制数是(补码)11111101。
程序执行的时候,操作的是数值的编码表示,也就是数值在内存中的二进制表示。比如
说,程序取-3 的时候,就去取 11111101。
(1)对无符号数 3 来说,x<<1 往左移一位,最左边的位移掉了,最右边的移进来的位补
零。变成 00000110,所以结果是 6;x>>1 往右边移一位,由于是无符号数,所以逻辑右移,
最右边一位移掉,最左边移进来的位补零,变成 00000001,所以结果是 1。
(2)对于有符号数 3 来说,x<<1 往左移一位,最左边的位移掉了,最右边的移进来的位
补零。变成 00000110,所以结果是 6;x>>1 往右边移一位,由于是有符号数,可能发生逻
辑右移,也可能发生算术右移,这一点,C 标准并没有明确地指定是使用逻辑右移还是算术
右移。但大多数的机器都使用算术右移,变成 00000001,所以结果还是 1。但是请注意,这
只是说大多数的机器是这样的,你敢保证自己不会碰到特殊情况吗?
(3)对于有符号数-3 来说,x<<1 往左移一位,最左边的位移掉了,最右边的移进来的位
补零。变成 11111010,结果是-6。往右移一位,由于是有符号数,可能发生逻辑右移,也可
能发生算术右移。大多数机器使用算术右移,变成 11111110,结果是-2。
练习题:
1. unsigned short A = 10; printf("~A = %u\n", ~A); char c=128; printf("c=%d\n",c); 求屏
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
数字表达与操作
幕输出值
2. 在汇编语言还有一种叫作循环左/右移的操作,以循环左移为例,每一次移走的最
高位移到最右的低上。循环右移刚好相反,请用 C 语言写一个无符号整数的循环
左移和右移函数
PDF 文件使用 "pdfFactory Pro" 试用版本创建 www.fineprint.cn
推荐阅读
  • 深度学习理论解析与理解
    梯度方向指示函数值增加的方向,由各轴方向的偏导数综合而成,其模长表示函数值变化的速率。本文详细探讨了导数、偏导数、梯度等概念,并结合Softmax函数、卷积神经网络(CNN)中的卷积计算、权值共享及池化操作进行了深入分析。 ... [详细]
  • 机器学习中的相似度度量与模型优化
    本文探讨了机器学习中常见的相似度度量方法,包括余弦相似度、欧氏距离和马氏距离,并详细介绍了如何通过选择合适的模型复杂度和正则化来提高模型的泛化能力。此外,文章还涵盖了模型评估的各种方法和指标,以及不同分类器的工作原理和应用场景。 ... [详细]
  • 本实验主要探讨了二叉排序树(BST)的基本操作,包括创建、查找和删除节点。通过具体实例和代码实现,详细介绍了如何使用递归和非递归方法进行关键字查找,并展示了删除特定节点后的树结构变化。 ... [详细]
  • MATLAB实现n条线段交点计算
    本文介绍了一种通过逐对比较线段来求解交点的简单算法。此外,还提到了一种基于排序的方法,但该方法较为复杂,尚未完全理解。文中详细描述了如何根据线段端点求交点,并判断交点是否在线段上。 ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • 帝国CMS多图上传插件详解及使用指南
    本文介绍了一款用于帝国CMS的多图上传插件,该插件通过Flash技术实现批量图片上传功能,显著提升了多图上传效率。文章详细说明了插件的安装、配置和使用方法。 ... [详细]
  • 解决Windows 10无法正确加载ICA文件的问题:设置Citrix Receiver为默认打开程序
    当在Windows 10系统中遇到无法正确加载ICA文件的情况时,可以通过下载并安装Citrix Receiver,并将其设置为ICA文件的默认打开方式来解决问题。具体操作步骤包括找到ICA文件,选择合适的打开程序路径(通常是C:\Program Files (x86)\Citrix\ICA Client\wfcrun32.exe),并确保该程序被设为始终使用。 ... [详细]
  • 本教程涵盖OpenGL基础操作及直线光栅化技术,包括点的绘制、简单图形绘制、直线绘制以及DDA和中点画线算法。通过逐步实践,帮助读者掌握OpenGL的基本使用方法。 ... [详细]
  • 图数据库中的知识表示与推理机制
    本文探讨了图数据库及其技术生态系统在知识表示和推理问题上的应用。通过理解图数据结构,尤其是属性图的特性,可以为复杂的数据关系提供高效且优雅的解决方案。我们将详细介绍属性图的基本概念、对象建模、概念建模以及自动推理的过程,并结合实际代码示例进行说明。 ... [详细]
  • 获取计算机硬盘序列号的方法与实现
    本文介绍了如何通过编程方法获取计算机硬盘的唯一标识符(序列号),并提供了详细的代码示例和解释。此外,还涵盖了如何使用这些信息进行身份验证或注册保护。 ... [详细]
  • 本文详细介绍了 React 中的两个重要 Hook 函数:useState 和 useEffect。通过具体示例,解释了如何使用它们来管理组件状态和处理副作用。 ... [详细]
  • libsodium 1.0.15 发布:引入重大不兼容更新
    最新发布的 libsodium 1.0.15 版本带来了若干不兼容的变更,其中包括默认密码散列算法的更改和其他重要调整。 ... [详细]
  • 本文总结了涡喷发动机动平衡的几种有效方法,探讨了不同传感器和软件工具的应用,旨在帮助爱好者和工程师更好地理解和实现动平衡调整,确保发动机高效稳定运行。 ... [详细]
  • 汇编语言等号伪指令解析:探究其陡峭的学习曲线
    汇编语言以其独特的特性和复杂的语法结构,一直被认为是编程领域中学习难度较高的语言之一。本文将探讨汇编语言中的等号伪指令及其对初学者带来的挑战,并结合社区反馈分析其学习曲线。 ... [详细]
author-avatar
城市学院艺术英语
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有