byte[]和int相关知识点

最近在项目中遇到了不太理解的地方,这里总结一下

问题

  1. 为什么int转byte可能是个负数
  2. &0xff的作用
  3. byte和int是怎么相互转化的

基础

在解释问题之前,了解一些计算机基础是很重要的

原码,反码,补码

原码 反码 补码
+1 0000 0001 0000 0001 0000 0001
-1 1000 0001 1111 1110 1111 1111
  1. 正数反码补码原码相同
  2. 负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
  3. 负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1.

字节序(了解)

计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。

举例来说,数值0x2211使用两个字节储存:高位字节是0x22,低位字节是0x11。

理解字节序

两个知识点(重要)

  1. 计算机数的计算和存储是补码形式
  2. java只有有符号数

实例

有了上述概念,就可以举例说明了

int转byte可能是个负数

 int a=233;
 byte b=(byte)a;
 System.out.println(b);//结果为-23
 解析:  
 1.int是32位,233二进制补码形式(正数原码补码相同)  
 00000000 00000000 00000000 11101001[补码]  
 2.int转byte,byte是8位  
 (00000000 00000000 00000000) 11101001[补码]    
 3.去掉多余位数后剩下11101001[补码],求原码  
 11101001[补码]-> 10010111[原码] -> -23

&0xff的作用

  1. 只是为了取得低八位
  2. 保持补码一致性

byte和int是怎么相互转化的

int转byte

  1. 1246[补码] -> 00000000 00000000 00000100 11011110
  2. int是32位,byte是8位,所以将int转为byte需要4个字节
角标 [0] [1] [2] [3]
补码 00000000 00000000 00000100 11011110
真值 0 0 4 -34

代码解析

int a =1246
byte[] b = new byte[4]

由于byte只有8位,int有32位,所以需要通过右移运算,把每8位一组的值,移动到最后8位来计算,其他位忽略

第一步,求b[0]的值:

补码 00000000 00000000 00000100 11011110
右移24位 00000000 00000000 00000000 00000000
& 0xff 00000000 00000000 00000000 00000000
代码
b[0] = (byte) (a >> 24 & 0xff ) //值为 0;

第二步,求b[1]的值:

补码 00000000 00000000 00000100 11011110
右移16位 00000000 00000000 00000000 00000000
& 0xff 00000000 00000000 00000000 00000000
代码
b[1] = (byte) (a >> 16 & 0xff ) //值为 0;

第三步,求b[2]的值:

补码 00000000 00000000 00000100 11011110
右移8位 00000000 00000000 00000000 00000100
& 0xff 00000000 00000000 00000000 00000100
代码
b[2] = (byte) (a >> 8 & 0xff ) //值为 4;

第四步,求b[3]的值:

补码 00000000 00000000 00000100 11011110
右移0位 00000000 00000000 00000100 11011110
& 0xff 00000000 00000000 00000000 11011110

由于是int转byte,去除多余24位后11011110[补码]求真值为-34

代码
b[3] = (byte) (a  & 0xff ) //值为 -34;

完整代码

public static intToByteArr(int a){
  byte[] b = new byte[4]
  b[0] = (byte) (a >> 24 & 0xff )
  b[1] = (byte) (a >> 16 & 0xff )
  b[2] = (byte) (a >> 8 & 0xff )
  b[3] = (byte) (a  & 0xff )  
  return b;
}

byte[]转int

知道byte[] b = {0,0,4,-34}, 求int?只需把byte[]对应数的补码左移至原数对应的位置即可
第一步,b[0]对应的补码

补码 00000000 00000000 00000000 00000000
& 0xff 00000000 00000000 00000000 00000000
左移24位 00000000 00000000 00000000 00000000
代码
int a1 =  (b[0]  & 0xff )<<24 //值为 0;

第二步,b[1]对应的补码

补码 00000000 00000000 00000000 00000000
& 0xff 00000000 00000000 00000000 00000000
左移16位 00000000 00000000 00000000 00000000
代码
int a2 =  (b[1]  & 0xff )<<16 //值为 0;

第三步,b[2]对应的补码

补码 00000000 00000000 00000000 00000100
& 0xff 00000000 00000000 00000000 00000100
左移8位 00000000 00000000 00000100 00000000
代码
int a2 =  (b[2]  & 0xff )<<8 //值为 1024;

第四步,b[3]对应的补码

补码 11111111 11111111 11111111 11011110
& 0xff 00000000 00000000 00000000 11011110
代码
int a4 =  (b[3]  & 0xff ) //值为 222;

四个数相加起来结果1246
也可以这样理解

b[0]补码 00000000 00000000 00000000 00000000
b[1]补码 00000000 00000000 00000000 00000000
b[2]补码 00000000 00000000 00000100 00000000
b[3]补码 00000000 00000000 00000000 11011110
逐个或运算 00000000 00000000 00000100 11011110

补码对应的真值也为1246

完整代码

public static byteArrToInt(int a){
    int a1 =  (a[0]  & 0xff )<<24
    int a2 =  (a[1]  & 0xff )<<16 
    int a2 =  (a[2]  & 0xff )<<8
    int a3 =  (a[3]  & 0xff )
    return a1|a2|a3|a4;
}

参考

https://blog.csdn.net/wojiuai2093/article/details/50779879

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容

  • 「WTF系列」深入Java中的位操作 关于WTF系列 引 学完本章节你将学会位的基础概念与语法,并且还会一些骚操作...
    qiujuer阅读 878评论 0 5
  • 第二课程 java 的基础语法的基础 1.关键字都是小写,会变为蓝色 2.标志符: 标志符就是给类,接口,方法,变...
    浓茶馆阅读 757评论 0 0
  • 本篇为Java基础语法【上】,包含关键字、标识符、注释、原码反码补码、常量与变量、运算符这六部分内容。 关键字 定...
    Lois_Huang阅读 1,027评论 0 5
  • byte即字节的意思,java中的基本类型之一、也是java中长度最小的基本数字类型,通常在读取文件时需要用字节数...
    Kinsanity阅读 1,220评论 0 5
  • 在实现财务自由的过程中,有一个关键的词叫耐心。就是行动要积极,但内心要淡定从容,就像水中游的鸭子,表面上平静,下面...
    锡安的民阅读 712评论 0 50