Bits, Bytes and Integers——二进制unsigned以及Two-complement表示,十六进制

news2025/2/26 2:36:07

这篇文章梳理一下Bits, Bytes and Integers——二进制unsigned以及Two-complement表示,十六进制这些事儿。

计算机中所有数据都是用二进制的0和1组成的,直接上知识点。

二进制

Unsigned以及Two-complement

同样的一串二进制数,按照有符号或者无符号两种不同的方式解析,就会得到不同的值,但是这个二进制数本身是不变的。unsigned的就是无符号的解析,而two-complement则是有符号解析中最常用的一种。

unsigned

 unsigned其实就是最传统的二进制和十进制直接的转换对应啦,直接按位加,算就完事。

举个例子:对于10110,根据1在的位置,可以知道三个1的值分别为16+4+2=22。

对于一个N位的unsigned二进制数,它的二进制表示可以从00…00到11…11,也就是说可以表示的范围是:0~2^N-1

signed(Two-complement)

Two-complement是解释有符号数的常用解释办法。在2’s complement表示中,最左边的一位为符号位,为1就是负数,为0就是正数。而让这个数为负数的手段就是这个符号位也参与计算,让它以一个最高位的负权重来让整个结果变成负数。

举个例子:同样对于10110,它的值为-16+4+2=-10。因为这个时候最左边的那一位变成负数了。

在two’s complement representation中,正数左边一定有0填充,比如32 = 0100000,而不是100000,否则就变成负数了。

如何根据32的二进制表示知道-32的呢?公式:-x = ~x + 1

  1. 首先,我们知道unsigned下32为100000;
  2. 然后我们左边加一个0,这不会影响大小,但是给了一个符号位,从而方便后续操作,此时得到了0100000;
  3. 反转所有的位:1011111,再+1,得1100000就是我们要的-32。

问题来了,这个1100000也才7位啊,正常计算机里如果是int类型是32位,long类型是64位,那如何表示-32呢?很简单,补1即可(下面会讲到,扩充符号位值不变),int类型的-32位11111111 11111111 11111111 11100000。这就是Two-complement表示负数的奇妙之处,就算左边疯狂+1,最终结果加和依然不会变,不信你可以自己加一下看看。

关于Two-complement的范围,因为最左边的一位要拿来当作符号位,正数时左边要位0,因此整体范围要少一半。对于N位的二进制数,范围是:-2^(N-1)~2^(N-1)-1。

UMin,UMax,TMin,TMax 

UMin是unsigned下的最小,其实就是0;UMax则因为全是1,变成2的N次方-1。

TMin是Two’s Complement下的最小,第一位是1(负数),其他全是0,即-2的N-1次方;

TMax第一位是0(正数),其他全是1,所以值是2的N-1次方-1。

 上面的例子是N=16时的情况贴出来方便你理解,重点应关注各种对应的二进制表示。

这里补充一个特殊案例:-TMin还是TMin。首先你很轻易知道-TMin超过了Two-complement的表示范围,因为”-2的N-1次方到2的N-1次方-1“这个范围是不对称的。但具体原因我们可以按步骤算一下:

最后一行就是-x的二进制表示,可以发现依然是TMin。 

unsigned和signed两者之间类型转换

如果一个表达式中unsigned与signed混合,signed会隐式转换为unsigned再进行表达式的计算。在C语言中,(unsigned)a就是把a转为无符号,(int)a就是转为有符号。那么此时表达式:

-1 > 0U,是True还是False呢?应该是True。注意:这里U是unsigned类型。

用下面这个图来解释一下这个例子:首先-1转为unsigned类型,其二进制不变,数值变为了15,unsigned的15再和unsigned的0比较,所以是大于号。

 下面也是一些其他例子和结论关系,帮助你理解这个隐式类型转换。总之就是首先我们看有没有unsigned的,有的话就全转为unsigned的去处理,再比较大小。如果都是signed的话就直接比较即可。

Extension(扩展)和Truncation(截断)

扩展extension其实就是给一个数字更多的空间,这个很简单,不影响原数大小的情况下扩充位,就是直接在左边补符号位即可。

下面的例子中,本来x是short int类型,有2个字节,经过转为4个字节的int类型后,二进制表示就在左边补充了两个字节的符号位。

截断truncation更简单,直接把左边多余不要的位砍掉即可。然后根据结果reinterpreted重新解释。不管是那种类型,都这么干,如下图:

 所以truncation的结果是不稳定的,比如对于sign类型的数据之前还是正数,但因为去掉了左边的一些部分,导致新的第一个符号位变成了1,那就直接变成负数了。

十六进制

 十六进制的特点其实就是每一位的范围有16个选择,即0-15,只不过10往后用字母表示了。对于16进制我觉得一个比较重要的点是知道和二进制之间的快速转换。这里我们不需要通过十进制来当中间的过程,只要知道16进制中的一位对应半个字节,也就是4比特。即二进制中的每4位就可以转换成16进制中的一位。如:

        0xCAFE = 1100(C) 1010(A) 1111(F) 1110(E)

通过这种方式我们可以快速地实现二进制和十六进制之间的转换。

对于十六进制其他没什么好说的,从十六进制计算十进制也和从二进制计算十进制差不多,只不过从右往左每一位权重是16的0次方,16的1次方,16的二次方……

最后提一下位运算

非常基础的部分,就放在最后说吧,主要是&和&&,|和||的,~和!的区别值得说一下。

首先对于&, |, ~ 以及^,他们是针对二进制中的逐个比特0和1直接的计算的的。

 而对于&&,||以及!,它们针对的是布尔值True或False,返回值也只能是True(1)或False(0)。当我们对这些符号使用具体数据时,会涉及到自动转换:0会变成False,一切非0会变成True。来一个例子: !!3 = 1。 为什么呢?因为3不是0,就是True,则!3=False , !!3就是True了。

左移和右移

首先你得知道左移n位会将原数字乘以2的n次方,右移n位则是缩小2的n次方

对于左移操作,基本就是直接在右边补0; 但对于右移,分为逻辑右移(左边补0)和算术右移(左边补符号位),算数右移主要是为了负数(最左边符号位位1)的符号不变,如果是正数的话,两种右移都是一样的。

 一般来说,右移补符号位是最常用的。

最后来一个思考:

为什么我们用two's-complement去代表signed类型数据呢?相比其他表示方法,这种representation好在哪里?原因如下:

Other representations of signed integers (ones-complement and sign-and-magnitude) have two representations of zero (+0 and −0), which makes testing for a zero result more difficult. Also, addition and subtraction of two’s complement signed numbers are done exactly the same as addition and subtraction of unsigned numbers (with wraparound on overflow), which means a CPU can use the same hardware and machine instructions for both.

简单来说使用two's-complement能让我们计算机不用管数据实际是啥类型,对于给定的二进制该加的加,该减的减,最终都能得到正确结果。

 最后的最后,附一套带答案的cmu官方练习题链接http://www.cs.cmu.edu/afs/cs/academic/class/15213-m23/www/activities/bits-and-bytes-soln.pdf作为补充,方便你加深理解。

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

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

相关文章

chatgpt赋能Python-python_headq

Python heapq模块介绍 简介 heapq模块是Python语言中的一个自带优先队列模块,提供一个堆队列(heap queue)算法实现。堆是具有以下两个特点的树形数据结构: 父节点的键值总是小于或等于(或总是大于或等于&#xff09…

英国VIBRO-METER VM600 CPUM 模块化CPU卡

特征 VM600 CPUM/IOCN机架控制器和通信接口卡对,支持Modbus RTU/TCP或PROFINET,以及前面板显示器使用以太网或RS-232串行连接到运行VM600 MPSx软件的计算机,对VM600机架中的保护卡(MPC4和AMC8)进行“一次性”配置管理前面板显示器&#xff0…

AI日报:“虚拟空间传送系统”能让你在家中七分钟环游世界

🚀 “虚拟空间传送系统”能让你在家中七分钟环游世界 “虚拟空间传送系统”能让你在家中七分钟环游世界,由谷歌地图3D Tiles API和ChatGPT带来沉浸式旅行; 又有人将人生六个月交给ChatGPT进行全球旅行计划,但这也引发人们对于LU…

28所示范性微电子院校占地面积排名,中山大学第一!

01中山大学13725 中山大学简称中大,现有广州、珠海和深圳三校区五校园,占地面积共计13725亩。1924年,孙中山亲手将广州地区多所高校整合创立国立广东大学。1926年定名为国立中山大学。如今该校由1952年院系调整后分设的中山大学和中山医科大学…

爱创科技携UDI解决方案亮相CMEF盛会!

2023年5月14日-17日,第87届中国国际医疗器械博览会(简称“CMEF”)在上海圆满举行。来自全世界20余个国家和地区品牌代表,近5000家企业参展,千余位业界大咖、意见领袖共聚盛会。 CMEF被业界看作全球医疗器械产业风向标&…

Maven方式构建Spring Boot项目

文章目录 一,创建Maven项目二,添加依赖三,创建入口类四,创建控制器五,运行入口类六,访问Web页面七,修改访问映射路径八,定制启动标语1、创建标语文件2、生成标语字符串3、编辑标语文…

Golang idea panic()中报错解决

本地Golang升级到1.18后,发现原本写的一些代码在Goland中出现了一些红色的波浪线,将鼠标移到错误提示上,有如下的显示: Cannot use err (type error) as the type any 复制 image 源代码: conn, err : listener.Ac…

【操作系统】内存

内存的基础知识 什么是内存,有何作用? 内存可存放数据。 程序执行前需要先放到内存中才能被CPU处理——缓和CPU与硬盘之间的速度矛盾 指令的工作是基于“地址”的,每个地址对应一个数据的存储单元 如何把逻辑地址转换为物理地址&#xff1f…

Linux安装Redis数据库,无需公网IP实现远程连接

文章目录 1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 保留一个固定tcp地址4.2 配置固定TCP地址4.3 使用固定的tcp地址连接 转发自cpolar内网穿透的文章:公网远程连接…

Linux——分析和排查系统故障

个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。座右铭:海不辞水,故能成其大;山不辞石,故能成其高。 个人主页:小李会科技的…

分布式事务及Seata 1.6.1案例

文章目录 一、分布式事务二、什么时候需要用到分布式事务三、分布式理论CAP定理BASE理论 四、分布式事务解决方案刚性事务2PC3PC2PC和3PC对比 补偿事务TCC 基于消息队列的最终一致性本地消息表消息事务MQ事务消息和本地消息表对比 各方案常见使用场景总结 五、Seata 1.6.1测试1…

android应用市场的上线流程

国内Android应用市场有很多,各有各的优势,对于开发者而言会在每个市场发布,或者在主要的市场发布后其它应用市场会抓取信息并自动上线App,这也节省开发者上线时间。App上线前首先要申请软件著作权,国内应用市场上线基本…

【GPT科技系列】国内开发者调用openAI-API科技方法

1. 前言 openAI上线7个月了,但是随着openAI的约束越来越多,国内开发者想要使用openai的接口实现开发简直就是难上加难。那真的就没有办法了吗?no no no,CF解决一切不开心~ 2.准备工作 我们需要一个国际域名 注册cloudflare账号 …

OPPO哲库事件 “ 始末 ” ! 集体打哑谜?

1►OPPO哲库解散 2019 年,美国商务部以“科技网络安全”为由,将华为公司及其70家附属公司列入出口管制“实体名单”。与此同时,OPPO 创始人兼 CEO陈明永对外宣布,公司将为未来三年内投入 500 亿元用于前沿技术和深水区技术的探索…

Colab解压压缩包删除非空文件夹的方式

Colaboratory 简称“Colab”,Google Research 团队开发,任何人都可以通过浏览器编写和执行任意 Python 代码,尤其适合机器学习、数据分析、教育目的。Colab 是一种托管式 Jupyter 笔记本服务,用户无需设置,就可直接使用…

【Spring】Spring之publishEvent

观察者模式Spring之publishEvent事件处理 1.使用场景 这个一般什么时候使用,我们一般是在不同的bean直接进行信息传递,比如我们beanA的事件处理完后,需要beanB进行处理一些业务逻辑的时候这种情况就一般可以使用publish-event解决。 可用于…

如何将大批量的车辆合格证图片转为excel表格?

之前我们介绍了用金鸣识别在线将车辆合格证转为excel的操作方法,但这种方法有一个局限性,就是网页版仅支持一次性5张图片的识别转换,如果量大,我们需要分为很多次反复地进行转换,会略显繁琐,有没有一种更快…

Linkage Mapper中的局部和全局地图比较

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Linkage Mapper解密数字世界链接 文章目录 一、介绍1.1 Linkage Mapper概述二、局部地图2.1 局部地图的定义2.2 局部地图的构建方法

高维向量搜索:在 Elasticsearch 8.X 中利用 dense_vector 的实战探索

近年来,随着深度学习技术的发展,向量搜索引发了人们的广泛关注。早在 Elasticsearch在7.2.0 版本引入了dense_vector字段类型,支持存储高维向量数据,如词嵌入或文档嵌入,以进行相似度搜索等操作。在本文中,…

怎样录屏不带水印?分享一款无水印录制视频软件!

案例:怎样录制无水印的视频? 【我平常录制的录屏带有软件自带水印,这样十分影响观感。怎样才能录制无水印的视频?】 一款好的录屏软件,可以更好地帮助我们录制电脑屏幕上的操作或是制作教学视频。然而,很…