精华内容
下载资源
问答
  • 获取java byte无符号数值

    千次阅读 2018-03-03 18:51:14
    转自:http://blog.csdn.net/todd911/article/details/9378319首先看如下代码:[java] view plain copybyte a = (byte)234;...因为javabyte是有符号的,byte 2^8,除去符号位,范围在 -128~127。如果想输出...

    转自:http://blog.csdn.net/todd911/article/details/9378319


    首先看如下代码:

    [java]  view plain  copy
    1. byte a = (byte)234;  
    2. System.out.println(a);  

    上面的代码,结果是-22,而不是234。因为java中byte是有符号的,byte 2^8,除去符号位,范围在 -128~127。

    如果想输出234如何处理?

    [java]  view plain  copy
    1. byte a = (byte)234;  
    2. System.out.println(a);        
    3. int i = a&0xff;  
    4. System.out.println(i);  

    首先 ,一个十六进制字节是这样定义的:char a=0xFF=255, 一个字节总是由一对十六进制数来表示,上面的a是一个字符,即一个字节;十六进制数F和F组成以一对十六进制数。这对十六进制数转换为二进制数为:11111111,正好是8 bits,一个字节。

    Java中的int是4个字节,0xff默认是整形,占4个字节,a是byte,占1个字节,进行&操作的细节如下:

        00000000 00000000 00000000 11101010    a

    &

        00000000 00000000 00000000 11111111    0xff

    ---------------------------------------------------------------------

    =  00000000 00000000 00000000 11101010

    结果是int,但是符号位是0,说明是正数,最后就是正整数234 = 2^7 + 2^6 + 2^5 + 2^3 + 2^1 = 128 + 64 + 32 + 8 + 2 

    其实这个方法在C语言中也可以获取有符号char的无符号值,但是C语言中可以直接使用unsigned来转换就可以,比这个方便。


    对于两个byte合并成一个short的类型的情况,可以把高字节左移8位与上0xFFFF + 低字节与上0xFF。


    这样就得到了用一个short的类型表示两个无符号的byte。

    展开全文
  • java byte无符号数值

    千次阅读 2014-05-14 14:33:25
    转自: ... ...首先看如下代码: ...byte a = (byte)234;...因为javabyte是有符号的,byte...其实这个方法在C语言中也可以获取有符号char的无符号值,但是C语言中可以直接使用unsigned来转换就可以,比这个方便。

    转自:http://blog.csdn.net/todd911/article/details/9378319


    首先看如下代码:

    byte a = (byte)234;
    System.out.println(a);

    上面的代码,结果是-22,而不是234。因为java中byte是有符号的,byte 2^8,除去符号位,范围在 -128~127。

    如果想输出234如何处理?

    byte a = (byte)234;
    System.out.println(a);		
    int i = a&0xff;
    System.out.println(i);

    首先 ,一个十六进制字节是这样定义的:char a=0xFF=255, 一个字节总是由一对十六进制数来表示,上面的a是一个字符,即一个字节;十六进制数F和F组成以一对十六进制数。这对十六进制数转换为二进制数为:11111111,正好是8 bits,一个字节。

    Java中的int是4个字节,0xff默认是整形,占4个字节,a是byte,占1个字节,进行&操作的细节如下:

        00000000 00000000 00000000 11101010    a

    &

        00000000 00000000 00000000 11111111    0xff

    ---------------------------------------------------------------------

    =  00000000 00000000 00000000 11101010

    结果是int,但是符号位是0,说明是正数,最后就是正整数234 = 2^7 + 2^6 + 2^5 + 2^3 + 2^1 = 128 + 64 + 32 + 8 + 2 

    其实这个方法在C语言中也可以获取有符号char的无符号值,但是C语言中可以直接使用unsigned来转换就可以,比这个方便。


    展开全文
  • Java面试题 :byte b = (byte)128; 定义变量语句是否正确 正确 1. 首先,分析基本数据类型 只写128,说明128是整型(int类型), 128L 或128F 等等,说明是long类型(L),单精度浮点类型(F) (byte)128中...

    Java面试题 :byte b = (byte)128; 定义变量语句是否正确

    正确

    1. 首先,分析基本数据类型

    • 只写128,说明128是整型(int类型),

    • 128L 或128F 等等,说明是long类型(L),单精度浮点类型(F)

    • (byte)128中128是整型(int),只不过是强制类型转换为 字节类型(byte)

    2. byte b = (byte)128; 只出现了 字节类型(byte)和整型(int),对两者具体分析

    整型(int)在内存中占32位,

    字节类型(byte)在内存中占8位,

    所以,经过强制类型转换,把int类型转化为byte类型,byte只保存了int类型的低8位,其它位都舍弃,有符号类型,最高位都是符号位, 1表示负数, 0表示正数
    如下图解释:
    在这里插入图片描述


    再说一点:java中基本数据类型没有无符号类型(C、C++中有),只有有符号类型

    Java的设计者感到无符号整数是不必要的。具体地说,他们感到无符号(unsigned)概念主要被用来指定高位(high-orderbit)状态,它定义了当int表示一个数字时的符号。Java对高位含义的管理是不同的,它通过增加一个专门的“无符号右移”运算符来管理高位。这样,就不需要无符号整数了。

    3. 分析128

    在这里插入图片描述


    负数怎么计算的呢?

    用补码算

    4. 例子

    	public static void main(String[] args) {		
    	    byte a128 = (byte)128;
    		System.out.println(a128);    //  -128
    		
    		byte a129 = (byte)129;
    		System.out.println(a129);    //  -127
    		
    		byte a_128 = (byte)-128;
    		System.out.println(a_128);   //  -128
    		
    		byte a_129 = (byte)-129;
    		System.out.println(a_129);	 //   127
    	}
    

    数0的补码表示是唯一的。
    [+0]补=[+0]反=[+0]原=00000000
    [ -0]补=11111111+1=00000000

    展开全文
  • Java无符号类型是怎么回事

    千次阅读 2016-09-27 21:32:59
    原文作者:Sean R....Java 中的无符号类型是怎么回事儿? 在 C 和 C++ 这样的语言中,都提供了不同长度的整数类型:char, short, int, long (实际上,char 并不是真正的整数,但是你可以

    原文地址:http://www.darksleep.com/player/JavaAndUnsignedTypes.html

    原文作者:Sean R. Owens

    以下是正文


    Java 中的无符号类型是怎么回事儿?

    在 C 和 C++ 这样的语言中,都提供了不同长度的整数类型:charshortintlong (实际上,char 并不是真正的整数,但是你可以把它当成整数来用。在实际应用场景中,很多人在 C 语言中用 char 来存储较小的整数)。在大部分的 32 位操作系统上,这些类型分别对应 1 字节,2 字节,4 字节和 8 字节。但是需要注意的是,这些整数类型所对应的字节长度在不同的平台上是不一样的。相对而言,由于 Java 是针对跨平台来设计的,所以无论运行在什么平台上,Java 中的 byte 永远是 1 字节,short 是 2 字节,int 是 4 字节,long 是 8 字节。

    C 语言中的整数类型都提供了对应的“无符号”版本,但是 Java 中就没有这个特性了。我觉得 Java 不支持无符号类型这个事儿实在是太不爽了,你想想,大量的硬件接口、网络协议以及文件格式都会用到无符号类型!(Java 中提供的 char 类型和 C 中的 char有所不同,在 Java 中,chat 是用 2 个字节来表示 Unicode 值,在 C 中,char 是用 1 个字节来表示 ASCII 值。虽然可以在 Java 中把 char 当做无符号短整型来使用,用来表示 0 到 2^16 的整数。但是这样来用可能产生各种诡异的事情,比如当你要打印这个数值的时候实际上打印出来的是这个数值对应的字符而不是这个数值本身的字符串表示)。

    那么,如何应对 Java 中无符号类型的缺失?

    好吧,对于我给出的这种方案,你可能会不喜欢……

    答案就是:使用比要用的无符号类型更大的有符号类型。

    例如:使用 short 来处理无符号的字节,使用 long 来处理无符号整数等(甚至可以使用 char 来处理无符号短整型)。确实,这样看起来很浪费,因为你使用了 2 倍的存储空间,但是也没有更好的办法了。另外,需要提醒的是,对于 long 类型变量的访问不是原子性操作,所以,如果在多线程场景中,你得自己去处理同步的问题。

    如何以无符号的形式存储和读取数据?

    如果有人从网络上给你发送了一堆包含无符号数值的字节(或者从文件中读取的字节),那么你需要进行一些额外的处理才能把他们转换到 Java 中的更大的数值类型。

    还有一个就是字节序问题。但是现在我们先不管它,就当它是“网络字节序”,也就是“高位优先”,这也是 Java 中的标准字节序。

    从网络字节序中读取

    假设我们开始处理一个字节数组,我们希望从中读取一个无符号的字节,一个无符号短整型和一个无符号整数。

    short anUnsignedByte = 0; 
    char anUnsignedShort = 0; 
    long anUnsignedInt = 0; 
    int firstByte = 0; 
    int secondByte = 0; 
    int thirdByte = 0; 
    int fourthByte = 0; 
    byte buf[] = getMeSomeData(); 
    // Check to make sure we have enough bytes 
    if(buf.length < (1 + 2 + 4)) doSomeErrorHandling(); 
    int index = 0; 
    firstByte = (x000000FF & ((int)buf[index])); 
    index++; 
    anUnsignedByte = (short)firstByte; 
    
    firstByte = (x000000FF & ((int)buf[index])); 
    secondByte = (x000000FF & ((int)buf[index+1])); 
    index = index+2; 
    anUnsignedShort = (char) (firstByte << 8 | secondByte); 
    
    firstByte = (x000000FF & ((int)buf[index])); 
    secondByte = (x000000FF & ((int)buf[index+1])); 
    thirdByte = (x000000FF & ((int)buf[index+2])); 
    fourthByte = (x000000FF & ((int)buf[index+3])); 
    index = index+4; 
    anUnsignedInt = ((long) (firstByte << 24 
                            | secondByte << 16 
                            | thirdByte << 8 
                            | fourthByte)) 
                            & xFFFFFFFFL;

    好吧,现在看起来有一点儿复杂。但是实际上很直观。首先,你看到很多这样的东东:

    x000000FF & (int)buf[index]

    首先,把有符号的 byte 提升成 int 类型,然后对这个 int 进行按位与操作,仅保留最后 8 个比特位。因为 Java 中的 byte 是有符号的,所以当一个 byte 的无符号值大于 127 的时候,表示符号的二进制位将被设置为 1(严格来说,这个不能算是符号位,因为在计算机中数字是按照补码方式编码的),对于 Java 来说,这个就是负数。当将负数数值对应的 byte 提升为 int 类型的时候,0 到 7 比特位将会被保留,8 到 31 比特位会被设置为 1。然后将其与 0x000000FF 进行按位与操作来擦除 8 到 31 比特位的 1。上面这句代码可以简短的写作:

    xFF & (int)buf[index]

    Java 自动填充 0xFF 的前导的 0 ,并且在 Java 中,位操作符 & 会导致 byte 自动提升为 int

    接下来你看到的是很多的按位左移运算符 <<。 这个操作符会对左操作数按位左移右操作数指定的比特位。所以,如果你有一个 int foo = 0x000000FF,那么 foo << 8 会得到 0x0000FF00foo << 16 会得到 0x00FF0000

    最后是按位或操作符 |。假设你现在把一个无符号短整型的 2 个字节加载到了对应的整数中,你会得到 0x00000012 和 0x00000034 两个整数。现在你把第一个字节左移 8 位得到 0x00001200 和 0x00000034,然后你需要把他们再拼合回去。所以需要进行按位或操作。0x00001200 | 0x00000034 会得到 0x00001234,这样就可以存储到 Java 中的 char类型。

    这些都是基础操作。但是对于无符号 int,你需要把它存储到 long 类型中。其他操作和前面类似,只是你需要把 int 提升为 long 然后和 0xFFFFFFFFL 进行按位与操作。最后的 L 用来告诉 Java 请把这个常量视为 long 来处理。

    向网络写入字节序

    假设现在我们要把上面步骤中我们读取到的数值写入到缓冲区。我们当时是按照无符号 byte,无符号 short 和无符号 int 的顺序读取的,现在,甭管什么原因吧,我们打算按照无符号 int,无符号 short 和无符号 byte 的顺序来写出。

    buf[0] = (anUnsignedInt & 0xFF000000L) >> 24; 
    buf[1] = (anUnsignedInt & 0x00FF0000L) >> 16; 
    buf[2] = (anUnsignedInt & 0x0000FF00L) >> 8; 
    buf[3] = (anUnsignedInt & 0x000000FFL); 
    
    buf[4] = (anUnsignedShort & 0xFF00) >> 8; 
    buf[5] = (anUnsignedShort & 0x00FF); 
    
    buf[6] = (anUnsignedByte & 0xFF);

    字节序到底是怎么回事儿?

    这是什么意思?我需要关注吗?以及,网络字节序什么样的?

    Java 中所使用的“高位优先”字节序又被称为“网络字节序”。Intel x86 处理器是“低位优先”字节序(除非你在上面运行 Java 程序)。x86 系统创建的数据文件通常是(但不是必须的)低位优先的,而 Java 程序创建的数据文件通常是(但不是必须的)高位优先的。任何系统都可以按照自己需要的字节序来输出数据。

    字节序是什么意思?

    “字节序”是指计算机是按照何种顺序在内存中存储数值的。常见的无非是高位优先和低位优先两种模式。你当然需要关注字节序的问题了,否则,如果你按照高位优先的字节序去读取一个低位优先字节序存储的数据文件,很可能就只能得到乱七八糟的数据了,反之亦然。

    任何数值,无论是何种表达方式,比如 5000,000,007 或者它的 16 进制格式 0x1DCD6507,都可以看做是数字字符串。对于一个数字字符串,我们可以认为它有开始(最左),有结束(最右)。在英语中,第一个数字就是最高位数字,例如 5000,000,007 中的 5 实际上表示的是 500,000,000。最后一位数字是最低位数字,例如 500,000,007 中的 7对应的值是 7

    当我们说到字节序的时候,我们是参照我们写数字时候的顺序。我们总是从高位开始写,然后是次高位,直到最低位,是不是这样啊?

    在上面的例子中,数值 500,000,007,对应 16 进制表示方式是 0x1DCD6507,我们把它分成 4 个独立的字节:0x1D0xDC0x65 和 0x07,对应 10 进制的值 29, 205, 101 和 7。最高位字节 29 表示 29 *256 * 256 * 256 = 486539264,接下来是 205,表示 205 * 256 * 256 = 13434880,然后是 101,表示 101 * 256 = 25856,最后一个 7 就是 7 * 1 = 7。它们的值:

    486539264 + 13434880 + 25856 + 7 = 500,000,007

    当计算机在它的内存中存储这 4 个字节的时候,假设存储到内存的地址是 2056, 2057, 2058 和 2059。那么问题来了:到底在哪个内存地址上存储哪个字节呢?它可能是在地址 2056 存储 29, 2057 存储 205,2058 存储 101,2059 存储 7,就像你写下这个数字的顺序一样,我们称之为高位优先。但是,其他的计算机架构可能是在 2056 存储 7,2057 存储 101, 2058 存储 205, 2059 存储 29,这样的顺序我们称之为低位优先。

    针对 2 个字节的以及 8 个字节的存储方式,也是同样的。最高位字节称为 MSB,最低位字节称为 LSB。

    好吧,那么我为什么要关心字节序的问题?

    这个视情况而定了。通常情况下你不需要关心这个问题。无论你在什么平台运行 Java 程序,它的字节序都是一样的,所以你就无需关心字节序的问题。

    但是,当你要处理其他语言产生的数据呢?那么,字节序就是一个大问题了。你必须得保证你按照数据被编码的顺序来进行解码,反之亦然。如果你足够幸运,通常在 API 或者协议规范、文件格式说明中找到关于字节序的说明。如果不巧……祝你好运吧!

    最重要的是,你需要清晰的了解你所使用的字节序是什么样的以及你需要处理的数据的字节序是什么样的。如果二者不同,你需要进行额外的处理来保证正确性。还有就是,如果你需要处理无符号数值,你需要确保将正确的字节放到对应 integer/short/long 类型的正确位置。

    网络字节序又是什么?

    当设计 IP 协议的时候,高位优先字节序被设计为网络字节序。在 IP 报文中德数值类型都是按照网络字节序存储的。产生报文的计算机所使用的字节序称为“宿主机字节序”,可能和网络字节序一样,也可能不一样。和网络字节序一样,Java 中的字节序是高位优先的。

    为什么没有无符号类型?

    为什么 Java 不提供无符号类型呢?好问题!我也常常觉得这个事情非常诡异,尤其是当时已经有很多网络协议都使用无符号类型了。在 1999 年,我在 Web 上也找了很久(那个时候 google 还没有这么棒),因为我总是觉得这事儿不应该是这样。直到有一天我采访 Java 发明者中的一位(是 Gosling 吗?不太记得了,要是我保存了当时的网页就好了),这位设计者说了一段话,大意是:“嘿!无符号类型把事情搞复杂了,没有人真正需要无符号类型,所以我们把它赶出去了”。

    这里有一个页面,是记录了一次对 James Gosling 的采访,看看能否收到一些启发:

    http://www.gotw.ca/publications/c_family_interview.htm

    问:程序员经常讨论使用“简单语言”编程的优点和缺点。你怎么看待这个问题?你觉得 C/C++/Java 算是简单语言吗?

    Ritchie: 略

    Stroustrup:略

    Gosling:作为一个语言设计者,我不太理解所谓的“简单”结束了是什么意思,我希望 Java 开发者把这个概念留在他自己脑海里就好啦。举例来说,按照那个定义,Java 不算是简单语言。实际上很多语言都会在极端案例下完蛋,那些极端案例是人们都不会理解的。你去问 C 语言开发人员关于无符号的问题,你很快就会发现没有几个 C 语言开发人员真正理解无符号类型到底发生了些什么,什么是无符号运算。这些事情让 C 语言变得复杂。我觉得 Java 语言是非常简单的。

    另外,参考:

    http://www.artima.com/weblogs/viewpost.jsp?thread=7555

    Oak 往事……

    by Heinz Kabutz

    2003 年 7 月 15

    为了丰富我对 Java 历史的了解,我开始研究 Sun 的网站,无意间发现了 Oak 0.2 的语言规范书。Oak 是 Java 语言最早使用的名称,这份文档算是现存的最古老的关于 Oak 的文档了。

    ……

    无符号整数(3.1 节)

    规范书说:“8 比特,16 比特,32 比特,64 比特的,这 4 种不同宽度的整数类型都是有符号的,除非在前面加上 unsigned 修饰符”。

    在侧栏中又说:“无符号类型尚未实现;可能永远也不会实现了。” 好吧,就是这样了。




    展开全文
  • java无符号类型的解决方案

    万次阅读 2016-07-07 18:10:17
    Java中,不存在Unsigned无符号数据类型,但可以轻而易举的完成Unsigned转换。 方案一:如果在Java中进行流(Stream)数据处理,可以用DataInputStream类对Stream中的数据以Unsigned读取。 Java在这方面提供了支持,...
  • java无符号类型处理(转载从网络)

    千次阅读 2013-05-19 15:21:26
    Java中,不存在Unsigned无符号数据类型,但可以轻而易举的完成Unsigned转换。 方案一:如果在Java中进行流(Stream)数据处理,可以用DataInputStream类对Stream中的数据以Unsigned读取。  Java在这方面提供...
  • 最近在做一个项目,需要和C++通讯,双方通讯...JAVA是有符号的数据类型,最高位表示符号类型那个,如果无符号类型接收有符号的类型int, 那就用LONG,然后发现是错误的,发现高位的32位存在值,低32位是无符号类型I...
  • Java中int与byte数组转换详解

    千次阅读 2019-04-12 11:39:31
    Java中int与byte数组转换详解
  • Java数据类型之byte、char

    万次阅读 2013-09-07 09:57:20
    Java 有8中基本数据类型,分别是byte、int、long、char、float、double、boolean。 1.byte、char的简单介绍 有时候总是搞不清byte、char,所以就现在好好的整理一下: 一个byte型整数在内存中占8位,也就是一个字节. ...
  • 无符号字节类型,unsigned byte 转换

    千次阅读 2015-07-26 12:23:15
    [size=medium]原码, 反码和补码详细知识参考: ...计算机内存中存储的是带符号位的二进制补码。 十进制字面常量具有一个很好的属性,即所有的十进制字面常量都是正的,而十六进制或是八进制字面常量并不具有着个属...
  • 背景 :  项目程序中用到需要socket 传输指令到C++程序中,需要TCP 的连接方式。 所以就想到用socket 来连接 。 问题: c++ 接收字节和字节的大小... 而C++中 可以定义 unsigned char 设置无符号数据类型。  ...
  • 在代码层面上解决由于Java用有符号数值类型映射MySQL无符号数值类型而导致的数值溢出问题。 如果MySQL数据库中定义一...比如给User表定义一个年龄字段age,类型是无符号的TINYINT(定义有符号的不合逻辑),在Java
  • byteJava 原始类型。byte类型简称“字节型”,用于表示整数。 int 是 Java 原始类型。 int类型简称“整型”,用于表示整数。 short是java原始类型。 short类型简称“短整型”,用于表示整数。 long是java原始...
  • 2、移位运算:java移位运算符三种:(左移)、>>(带符号右移)和>>>(无符号右移)。 --1、 左移运算符 左移运算符使指定值的所有位都左移规定的次数。 1)它的通用格式如下所示: value ...
  • 与C语言不同,JAVA里没有无符号整型

    万次阅读 2013-08-20 11:46:59
    与C语言不同,JAVA里没有无符号整型。 JAVA的8种基本类型(boolean,byte,short,char,int,long,float,double)都是有符号的。 与C语言不同,JAVA里的char类型,占2个字节,专为Unicode字符所设计; 与C语言...
  • Javabyte类型详解

    千次阅读 多人点赞 2020-03-04 00:12:24
    bytejava的基本数据类型之一,在计算机存储中以字节为单位,8位比特(bit)组成一个字节。 为什么弄清楚byte这么重要呢?因为智能硬件的数据传输大部分协议都是按字节一位一位来解析的,对于字节的运算十分频繁,...
  • 在使用 MySQL 数据库的时候,把主键的数据类型设置成了 unsigned int (11),而在对象类里,此属性定义的为 int 。运行语句后抛出异常:java.lang.IllegalArgumentException: Can not set ...
  • 类 类 Byte 概述 UML类图 源码解析 ...Byte ...public final class Byte extends Number implements Comparable ...一个 Byte 类型的对象只包含一个类型为 byte 的字段。 此外,该类还为 byte 和 String 的相互
  • static String toUnsignedString(int/long i):将指定int或long型整数转换为无符号整数对应的字符串。 static String toUnsignedString(int/long i, int radix):将指定int或long型整数转换为指定进制的无符号...
  • 2、移位运算:java移位运算符三种:(左移)、>>(带符号右移)和>>>(无符号右移)。 --1、 左移运算符 左移运算符使指定值的所有位都左移规定的次数。 1)它的通用格式如下所示: value num 指定...
  • 1.2javaByte类的源码解析 1.3从JDK源码角度看Byte 1.4 自个源码笔记(基本上是参照上面两篇进行记述的) package java.lang; /* Byte类将一个基本类型byte封装在一个对象中。 一个Byte对象包含了一个byte类型...
  • 深入学习java源码之Byte.decode()与Byte.toUnsignedInt() 异常 异常就是有异于常态,和正常情况不一样,有错误出错。在java中,阻止当前方法或作用域的情况,称之为异常。 其中Error类中包括虚拟机错误和线程...
  • Short data_length = (short)...但是Lc域应被解释为无符号的值,因为具有负长度是无意义的。在上面的代码段中,Lc字节是按位和常数0xFF相与的,以将有符号的字节转化为无符号的值。另外一个方面javacard环境中,数的
  • javabyte数组的不同写法

    千次阅读 2017-08-18 17:34:56
    经常看到Java中对byte数组的不同定义,粗略整理的一下: 一个字节(byte)=8位(bit),“byte数组”里面全部是“byte”,即每一个byte都可以用二进制、十六进制、十进制来表示。 首先八位二进制数0000 ...
  • Java byte stream 字节流

    千次阅读 2020-03-12 13:15:08
    本文介绍了 Javabyte stream(字节流)的相关内容。。。
  • javaByte类的源码解析

    千次阅读 2017-04-16 20:26:54
    java.lang.Byte类的源码的解析

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 41,442
精华内容 16,576
关键字:

java定义无符号byte

java 订阅