Int类的129为什么转成byte就变成-127了?

作为一个java开发人员,接触的基本都是上层的,都是以应用为主,根据业务实现功能,但今天无意间发现了一个小问题,int类型的129转成byte类型变成了-127,我知道是因为位数截取的原因,但是还没有探究过为什么是-127。经了解后得以解惑。

首先要搞清楚的是计算机对数据的存储方式,在这里有两个概念大家要清楚;

1、反码:反码就是对一个二进制数据逐个取反 如1011010的反码就是0100101。

2、补码:补码很简单,就是在反码的基础上加1,比如上面的反码是0100101,那补码就是0100110

计算机对数据的存储方式是以补码的形式存储的,正数的反码和补码都是他的源码,是不不变的,负数的反码补码算法就是上面的1和2规则,且存储的时候高位为符号位,1表示负数,0表示正数。

现在回到我们问题本身来:

129的二进制是010000001,高位为0是正数,转成byte后,应该byte的长度为8位,所以截取了后面8位,变成了10000001,高位就变成了1成了负数,在存储的时候先取反码,取反码时符号位是不变的 即:111111110,补码就是11111111,高位符号位不参与运算,其他的位数算出来是127加上符号就是-127,疑惑解答,希望也可以能让各位亲解惑

原文地址:https://www.cnblogs.com/GX1234/p/11699635.html

时间: 2025-01-01 21:07:24

Int类的129为什么转成byte就变成-127了?的相关文章

Java中int类型和tyte[]之间转换及byte[]合并

JAVA基于位移的 int类型和tyte[]之间转换 [java] view plaincopy /** * 基于位移的int转化成byte[] * @param int number * @return byte[] */ public static byte[] intToByte(int number) { byte[] abyte = new byte[4]; // "&" 与(AND),对两个整型操作数中对应位执行布尔代数,两个位都为1时输出1,否则0. abyte[

int类型和byte类型的强制类型转换

今天在读<Java网络编程>这本书的第二章 流 时,看到书中有一个地方关于int强制转换为byte类型时应注意的地方.这个地方有点细节,不过就应该把这种细节把握住. 情况是这样的,讲到InputStream的抽象方法read时,说到read返回一个int型,但实际是一个byte型的数据.这点从API也能考证.如图: 那么问题来了,int占4个字节,byte占1个字节,我们循环读取的时候将int型数组强制类型转换成byte时,会发生什么情况呢?代码如下: 1个字节占8位,既然实际返回的是byte

java基本数据类型转换成byte[]数组

import java.io.UnsupportedEncodingException;  public class ConToByte {      /**     * double转换byte     * @param  arr  byte[]     * @param  param    double   double类型的参数     * @param  index  int     */     public static void putDouble(byte[] arr, doub

为什么基类的析构函数要写成虚函数?

为什么基类的析构函数要写成虚函数? 答:在实现多态时,当用基类操作派生类,在析构时防止只析构基类而不析构派生类的状况发生. 代码说明如下 第一段代码: 1 #include<iostream> 2 using namespace std;   3    4 class ClxBase   5 {public:   6 ClxBase() {}   7 ~ClxBase() {cout << "Output from the destructor of class ClxB

String[255]在高版本Delphi里还是被解释成Byte,总体长度256,使用StrPCopy可以给Array String拷贝字符串

学了好多不了解的知识: procedure TForm1.Button1Click(Sender: TObject); var s1 : String; s2 : String[255]; begin s1:='ç1很好'; ShowMessage(s1); // 这里显示正常 s2:=s1; ShowMessage(s2); // 这里显示乱码. // 问这个问题的原因是,在一个recode pack 里定义了String[255],但是使用Unicode字符给它赋值的时候,就乱码了,这该怎么

Python基础(int类)

Python中一切都是对象,而对象是基于类创建的. 本篇文章主要介绍一下Python中主要的几种数据类型. 一.整数(int类) 提示:以下所有方法都是类中的方法,第一个参数都是self,统一都没有写出. 包含的方法有: 1.bit_length()#返回表示该数字时占用的最少位数 >>> (256).bit_length() 9 2.abs(x)     #返回绝对值 >>> abs(-9) 9 3.__add__(y)#等同于加法 x.__add__(y) <

Map 转换成byte[] 数组

把Map转换成byte数组,使用 ByteArrayOutputStream和ObjectOutputStream Map<String,String> map = new HashMap<String,String>(); map.put("name","aaa"); map.put("age","11"); try { byte[] bt = null; ByteArrayOutputStream

浅谈ByteBuffer转换成byte[]时遇到的问题

有些时候我们要把ByteBuffer转换成byte[]来使用.于是很多时候会用以下代码来转换: ByteBuffer buf; .....(一些往buffer写数据的操作) byte[] bs= new byte[buf.capacity()]; //想把buf里所有的byte都拿出来 buf.get(bs); 感觉一切都正常,运行后会发现BufferUnderflowException的异常.这一切是因为buf中的position搞的鬼,position的位置会随着put操作而移动,然后这时候

int类中的方法

我们知道在python中,一切对象都是类,对象的方法都封装在类中,现在来探讨一下int类中的方法: 我们可以通过help(int)和dir(int)来查看int类中都封装了那些方法:     1.bit_length() def bit_length(self): # real signature unknown; restored from __doc__ """ """返回表示该数字的二进制最少位数""" int