0xFF

news2024/12/4 1:50:16

为什么要加上“& 0xFF”?

拆分理解下
0xFF是16进制的表达方式,F是15;十进制为:255,二进制为:1111 1111
&运算符:如果2个bit都是1,则得1,否则得0

然后开始百度……

最后一路百度到计算机的原理之:原码、补码和反码,先简单讲下这三个词的意思吧!

我们已经知道计算机中,所有数据最终都是使用二进制数表达。
我们也已经学会如何将一个10进制数如何转换为二进制数。
不过,我们仍然没有学习一个负数如何用二进制表达。

比如,假设有一 int 类型的数,值为5,那么,我们知道它在计算机中表示为:
00000000 00000000 00000000 00000101
5转换成二制是101,不过int类型的数占用4字节(32位),所以前面填了一堆0。

现在想知道,-5在计算机中如何表示?

在计算机中,负数以其正值的补码形式表达。

什么叫补码呢?这得从原码,反码说起。

原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。

比如 00000000 00000000 00000000 00000101 是 5的 原码。

反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。

取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)

比如:将00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010。

称:11111111 11111111 11111111 11111010 是 00000000 00000000 00000000 00000101 的反码。

反码是相互的,所以也可称:

11111111 11111111 11111111 11111010 和 00000000 00000000 00000000 00000101 互为反码。

补码:反码加1称为补码。

也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。

比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010。

那么,补码为:

11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111 11111011

所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。转换为十六进制:0xFFFFFFFB。

再举一例,我们来看整数-1在计算机中如何表示。

假设这也是一个int类型,那么:  

先取1的原码:00000000 00000000 00000000 00000001
得反码: 11111111 11111111 11111111 11111110
得补码: 11111111 11111111 11111111 11111111
可见,-1在计算机里用二进制表达就是全1。16进制为:0xFFFFFFFF。

上面这么多蛋疼的操作仅仅是因为:在计算机中,负数以其正值的补码形式表达。

有的人可能会问:那为什么在计算机中,负数以其正值的补码形式表达?

为什么负数以其正值的补码形式表达:说到补码,就不得不引人另一个概念——模数。模数从物理意义上讲是某种计量器的容量。这里我们经常举的一个例子就是钟表,其模数为12,即每到12就重新从0开始,数学上叫取模或求余(mod),java、C#和C++里用%表示求余操作。例如:
14%12=2
如果此时的正确时间为6点,而你的手表指向的是8点,如何把表调准呢?有两种方法:一把表逆时针拨两个小时;二是把表顺时针拨10个小时,即
8-2=6
(8+10)%12=6
也就是说在此模数系统里面有
8-2=8+10
这是因为2跟10对模数12互为补数。因此有以下结论:在模数系统中,A-B或A+(-B)等价于A+[B补],即
8-2/8+(-2)=8+10
我们把10叫做-2在模12下的补码。这样用补码来表示负数就可以将加减法统一成加法来运算,简化了运算的复杂程度。
采用补码进行运算有两个好处,一个就是刚才所说的统一加减法;二就是可以让符号位作为数值直接参加运算,而最后仍然可以得到正确的结果符号,符号位无需再单独处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

到这里估计大家都能大概了解原码、补码和反码了,我们回到一开始的问题。

data[1] = (byte)(deY & 0xFF);

外部传进来一个参数func,这个参数有可能是负数的,例如传进来一个“-12”,“-12”二进制为:
0000 1100 取反: 1111 0011 补码加1: 1111 0100
byte –> int 就是由8位变 32 位 高24位全部补1: 1111 1111 1111 1111 1111 1111 1111 0100 ;
0xFF的二进制表示就是:1111 1111,高24位补0:0000 0000 0000 0000 0000 0000 1111 1111;

-12的补码与0xFF 进行与(&)操作 最后就是:0000 0000 0000 0000 0000 0000 1111 0100

最终保持“-12”取反码,补码加1的一致性。

byte类型的数字要&0xff再赋值给int类型,其本质原因就是想保持二进制补码的一致性。

当byte要转化为int的时候,高的24位必然会补1,这样,其二进制补码其实已经不一致了,&0xff可以将高的24位置为0,低8位保持原样。这样做的目的就是为了保证二进制数据的一致性。
————————————————
版权声明:本文为CSDN博主「尹中文」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yzwfeng/article/details/124098045

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

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

相关文章

【doxygen】doxygen 支持宏判断

文章目录 配置 doxygen代码中判断宏 配置 doxygen 定义自己的宏 HAL_CONFIG_USB 代码中判断宏 if HAL_CONFIG_USB your contents endif需要注意的是 Doxygen不支持直接的 elif 指令。Doxygen只提供了 if 和 endif 指令来实现条件性文档生成。如果您需要多个条件进行判断&am…

VRRP协议是什么?详解它的工作原理

作者:Insist-- 个人主页:insist--个人主页 作者会持续更新网络知识和python基础知识,期待你的关注 前言 本文将讲解VRRP是什么,以及它的工作原理,优点以及基本概念。 目录 一、VRRP协议是什么? 二、VRR…

Kubernetes·陈述式声明式资源管理

陈述式资源管理方法: 1.kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 apiserver 的接口 2.kubectl 是官方的CLI命令行工具,用于与 apiserver 进行通信,将用户在命令行输入的命令,组织并转化为 apiserver 能识别的信…

《PCL+QT》各版本环境配置问题总结

PCL各版本QT配置问题 一、资源下载1、vs2015 -pcl1.8.1 - qt5.12 -vtk82、 vs2019-pcl 1.11.1-qt 5.12-vtk8.23、 vs2019-pcl1.12.1-qt 6.2.4-vtk9.14 、vs2022-pcl1.13.0-qt 6.2.4-vtk9.2 二、版本1、 vs2015 -pcl1.8.1 - qt5.12 -vtk82、 vs2019-pcl 1.11.1-qt 5.12-vtk8.23、…

【C/C++】解析 类成员函数和this指针

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

RuntimeError: CUDA error: an illegal memory access was encountered

在跑一个Transformer的代码时&#xff0c;出现了这个错误。这个错误信息非常奇怪&#xff0c;通过Debug发现&#xff0c;模型的前向传播是正常的&#xff0c;损失也能计算出来&#xff0c;但是一开始反向传播就出问题了。经过尝试&#xff0c;发现是batch_size过大&#xff0c;…

SpringMvc中文件上传

文章目录 1.导入文件上传所需要的jar包 2. 配置文件解析器 3.写一个前端页面 4.写后台程序 1.导入文件上传所需要的jar包 <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.…

UTONMOS:元宇宙究竟是什么?

元宇宙其实是一个很好玩的事&#xff0c;就在前几年&#xff0c;很多人还认为当时元宇宙的概念市场上被叫做伪概念、纯营销概念&#xff0c;很多行业里的朋友们都说这是骗子才提的。 但是经过半年的发酵和发展&#xff0c;现在大家对“元宇宙”的认知就很不同了&#xff0c;因…

C++数据结构笔记(2)线性表顺序存储的底层实现

本章总结单链表的顺序存储方式及其C实现&#xff0c;重点的理论只需要熟背以下3条&#xff1a; 1.线性表是0个或者多个数据元素的有限序列&#xff0c;其中数据元素类型相同 2.线性表可以逐项访问和顺序存储 3.有顺序存储和链式存储两种存储方式。 接下来&#xff0c;通过动…

Android 逆向入门保姆级教程

作者&#xff1a;37手游移动客户端团队 前言 什么是 Android 逆向开发&#xff1f; Android 逆向开发是指对已发布的 Android 应用进行分析和破解&#xff0c;以了解应用程序的内部工作原理&#xff0c;获取应用程序的敏感信息&#xff0c;或者修改应用程序的行为。逆向开发可…

全网最牛,接口自动化测试mock框架模块实战,入门到高阶...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 mock的介绍 py3已…

基于Docker-compose实现的Postgresql-11的主从复制

参考文章&#xff1a; http://t.csdn.cn/EnOVn http://t.csdn.cn/XTJqZ 记录一次主从复制的配置经历 服务器主从角色分配 ipdb 版本角色192.168.33.23411主192.168.33.22511从 docker-compose.yml文件 version: "3.3" services:postgres:image: postgresql-gis:11…

Windows11添加用户自定义短语

比如要输入手机号码&#xff0c;直接输入sj就会弹出预先设定好的手机号&#xff0c;也可以预先设置好邮箱&#xff0c;身份证等等&#xff0c;这样就不用输入了 这个咋设置的有时候确实会忘记&#xff0c;所以就记下来了 步骤 第一步 打开设置 时间和语言>语言和区域 第二…

WebRTC的技术原理和使用浅析

一、基本介绍 WebRTC即网页即时通信&#xff0c;是一个支持网页浏览器进行音视频对很多 技术方案。 二、技术特征 1.实时通讯: WebRTc是一项实时通讯技术&#xff0c;允许网络应用或者站点&#xff0c;在不借助中间媒介的情况下&#xff0c;建立浏览器之间点对点的连接&…

Java读取文件内容到字符串

例如当前在D:\\test目录下有一个名为demo.txt的文件&#xff0c;文件里面的内容如下图所示&#xff1a; 第一种方式&#xff1a; 使用BuffererReader 缓冲字符输入流 import lombok.extern.slf4j.Slf4j;import java.io.BufferedReader; import java.io.File; import java.io.…

css对盒模型的理解

面试碰到的一个问题&#xff0c;记录一下 ’ CSS3中的盒模型有以下两种&#xff1a;标准盒子模型、IE盒子模型 盒模型都是由四个部分组成的: 分别是margin、border、padding和content。 标准盒模型和IE盒模型的区别在于设置width和height时&#xff0c;所对应的范围不同&#…

csproj文件常用设置及C#注释常用写法

csproj文件常用设置及C#注释常用写法 .NET新版SDK风格的csproj文件 打开可为空警告 <PropertyGroup><Nullable>enable</Nullable> </PropertyGroup>启动全局引用using 下图没有任何using&#xff0c;仍然不报错 <PropertyGroup><Implicit…

扑克牌最优组合算法题(动态规划+备忘录+快排)

题目如下 题目&#xff1a; 设一副包含点数从A到K,四种花色的52张牌, 将 三张及以上同点数不同花色的牌组 或者三张以及上的同花顺称为 组合, 求出给定一副20张以内的牌中,所能形成的最优的组合列表(最优即组合点数累加最大) 代码要运行正确而且要做输入处理&#xff0c;输出格…

Uncaught TypeError: Illegal invocation

使用console.time报错 console.time将在当前对象(即支持)的上下文中执行&#xff0c;发现一些老的chrome版本中&#xff0c;上下文可能有问题. 解决&#xff1a; 可以使用 console.time.call(window,1111)

关于Easy Mesh

随着网络技术的高速发展&#xff0c;家庭宽带进入了千兆时代&#xff0c;AR&#xff0c;VR&#xff0c;8K影视等高品质产品和智能家居正以前所未有的速度进入寻常百姓家&#xff0c;由于网络覆盖的问题&#xff0c;给WIFI网络应用带来了更大的考验。 WIFI网络覆盖一般是有四种方…