挖掘 0xFF深层的含义

2024-01-29 17:38
文章标签 深层 含义 挖掘 0xff

本文主要是介绍挖掘 0xFF深层的含义,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、前置知识?
    • 1.原码,补码,反码
  • 二、挖掘& 0xFF深层的含义
  • 总结


前言

int unsignedbyte = b & 0xFF;

上面的这段代码相信会较为容易的经常看到,但是我们往往会忽略为什么要这样,不这样行不行。接下来就此段代码,挖掘它的深层的含义。


一、前置知识?

1.原码,补码,反码

定义那些我在这儿就不在赘述了,我分享一下我的理解。
众所周知,冯诺依曼体系结构的计算机的一大特点就是

数据以二进制表示

这里的数据,不仅指文件数据,是计算机使用的一切数据,包括程序员编写的程序编译后的代码数据。直观上理解二进制,和十进制不同的是十进制是满十进一,而二进制是满二进一,所以二进制数据只包含0、1。如上,理解原码,反码,补码,我们也可以和我们熟悉的十进制来进行对比理解。
我们十进制数据中有正负之分,二进制数据也有。二进制数据怎么表示呢?这里有两派,一个是主张使用一个位置存放符号,这个缺点很明显,会导致存储密度下降。还有一派就是这里采用的原码表示正数,补码表示负数。(正数的原码和补码是一样的,所以计算机数据严格来说是用补码表示的)。首先明白一个道理,一个数的负数是什么?引用古代数学名著《九章算术》的话

两算得失相反,要令正负以名之

所以这里的意思就是说加起来等于零,就是这个数的负数。
所以用这里的知识,就能不用符号位表示二进制数据中的正负。
首先,没有了符号位(无符号数)默认为正数
比如十进制数(110)
bin:0110 1110
反码:就是逐位取反,结果就是原数和它的反码之前的和为oxFF
而补码就是反码加一,这里加一的意思就是使得原数和补码之间的和为0,这里的0是数据溢出代表的0

二、挖掘& 0xFF深层的含义

byte[] bytes = new byte[4];
//从当前文件指针读取4个字节的数据
imageBis.read(bytes,0,4);

从这里我们就获取到了四个字节的数据,那么我们可以直接用这四个字节的数据吗?答案是否定的!
我们之前理解到了,计算机内部数据存储用的是补码,而byte这个数据结构是有符号数,所以如果首位是一,它就会读取为负数,如果是零,它就会读为正数。
举个例子
bin 1001 0110
如果用byte读取就会表示有符号数-22,它实际表示的是无符号数150
知道了问题产生的原因,怎么实现转化呢?答案就是下面的代码:

首先在java中int是表示四个字节,所以上面的例子在运算之前会转化为四个字节的数据,高位补1

//oxFFFFFF96 & 0xFF = 0x96
//高位被&0截取了,只留了低位一个字节的有效数据0x96
int unsignedbyte = b & 0xFF;

到这里就应该挖掘结束了。

总结

& 0xFF实际上就是实现有符号数向无符号数之间的转换。
//截取了JDK BufferedInputStream类中的read方法说明 & 0xff的正确性
class:BufferedInputStream
public synchronized int read() throws IOException {if (pos >= count) {fill();if (pos >= count)return -1;}return getBufIfOpen()[pos++] & 0xff;}

这篇关于挖掘 0xFF深层的含义的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/657664

相关文章

Linux错误代码及其含义

最近在做工程的时候,程序在崩溃时候弹出了错误号,然后根据错误号搜索错误信息,很快解决之,特此记录。 在程序出错时,我们通过全局变量错误号errno和perror函数能够很快的定位到错误原因。 Linux错误代码及其含义 C NameValueDescription含义Success0Success成功EPERM1Operation not permitted操作不允许ENOENT2No

兔子-build.gradle中代码的含义

//声明构建的项目类型,这里当然是android了apply plugin: 'com.android.application'//设置编译android项目的参数android {// SDK的版本号,也就是API Level,例如API-19、API-20、API-21等等。compileSdkVersion 23//构建工具的版本,其中包括了打包工具aapt、dx等等。// 这个工具的目

SFC CSS 功能:深层选择/插槽选择器/动态绑定

深层选择器​ 如果您希望样式中的选择器scoped“深入”,即影响子组件,则可以使用:deep()伪类: <style scoped>.a :deep(.b) {/* ... */}</style> 以上内容将被编译为: .a[data-v-f3f3eg9] .b {/* ... */} 提示 创建的 DOM 内容v-html不受范围样式的影响,但您仍然可以使用深

MySQL数据类型 int(M)中M含义

int(M)我们先来拆分,int是代表整型数据那么中间的M应该是代表多少位了,后来查mysql手册也得知了我的理解是正确的,下面我来举例说明。 MySQL 数据类型中的 integer types 有点奇怪。你可能会见到诸如:int(3)、int(4)、int(8) 之类的 int 数据类型。刚接触 MySQL 的时候,我还以为 int(3) 占用的存储空间比 int(4) 要小, int(4)

区块链的含义是什么

目录 区块链的基本定义 区块链的构成与特性 区块链的类型 区块链的应用 区块链的基本定义 区块链是一种分布式数据存储、点对点传输、共识机制和加密算法等计算机技术的新型应用模式。它通过将数据区块按照时间顺序相连形成链式结构,确保数据的真实性和不可篡改性。 区块链的构成与特性 构成:区块链由多个数据区块组成,每个区块包含一定数量的交易记录,并通过哈希值与前一个区块相连。特性:区

c++ 链表tail->next = new ListNode(sum % 10); tail = tail -> next; 语句含义

这两行 C++ 代码: tail->next = new ListNode(sum % 10);tail = tail->next; 通常出现在处理链表(ListNode)的上下文中,特别是在实现与数字相加相关的算法时,比如“两个数相加”问题。下面是对这两行代码的详细解释: 代码背景 首先,有一个链表节点的结构体定义,通常会是这样的: struct ListNode {int val

c++ 解释return {it->second,i}; 这条语句中每个单词的含义

在 C++ 中,return {it->second, i}; 语句的含义可以分解为以下几个部分。 1. return 含义:return 是一个关键字,用于从一个函数中返回值。在函数执行到 return 语句时,会结束函数的执行,并将后面跟随的值返回给调用该函数的地方。 2. {it->second, i} 含义:这个部分使用了列表初始化(C++11 及以后版本引入的特性)。它表示创建一

在 “Label Studio” 和 “Android Studio” 中,“studio”的含义

这个词通常有以下含义: 一、工作场所或空间 可以理解为一个专门用于特定任务的工作区域。就像艺术家的工作室是他们进行创作的地方一样,在软件领域,这些带有 “studio” 的工具为开发者或使用者提供了一个集中进行特定开发、标注等工作的环境。 例如,Android Studio 为 Android 应用开发者提供了一个集成的开发环境,包括代码编辑、调试、测试等各种功能,开发者可以在这个环境中高效

python中**字典的含义

格式 **dict 例如 dict1 = {'name': '海鸥', 'gender': '男', 'age': 24, 'mobile': '123','des':'秒内噶'}def tmp1(name, gender, age, mobile, des):print(name, gender, age, mobile, des)def tmp2():tmp3 = tmp1