java sbyte_JAVA与c#中byte取值范围的差异

本文探讨了C#中的sbyte和byte类型与Java中的byte类型的差异,包括它们的取值范围和内存占用。在Java中,byte是带符号的,等价于C#的sbyte,而Java没有无符号类型。文章通过示例展示了如何在Java中将有符号的byte转换为无符号数值,并解释了这种转换的原理,涉及到类型提升和位运算。
摘要由CSDN通过智能技术生成

C#中分有符号类型的sbyte和无符号类型的byte

Console.WriteLine("byte.min:{0},byte.max:{1},{2}byte", byte.MinValue,byte.MaxValue, sizeof(byte));

Console.WriteLine("sbyte.min:{0},sbyte.max:{1},{2}byte", sbyte.MinValue, sbyte.MaxValue,sizeof(sbyte));

输出

byte.min:0,byte.max:255,1byte

sbyte.max:-128,sbyte.min:127,1byte

字节序列一般依赖于硬件,我们常用的intel cpu是小端的,而 java字节序列默认是bigEndian 大端模式

java中的byte是有符号类型的,对应c#的sbyte

@Testpublic voidtest()

{

System.out.printf("byte.min:%s, byte.max:%s,%dbyte\n",Byte.MIN_VALUE,Byte.MAX_VALUE,Byte.BYTES);

}

输出:

byte.min:-128, byte.max:127,1byte

Java中因为没有无符号类型的 unsigned byte,需要转换,才用的是扩容处理办法,一般建议用short。

因为java里面数值转换都会转换成int,此处返回值用int

public static int unsignedToBytes(byteb) {return b & 0xFF;

}

转换过程:

例如:将 有符号的byte -37转无符号的数值,java里面数值运算会先装int,所以有符号类型的-37变成如下形式

int i = 0x000000FF & i;

11111111 11111111 11111111 11011011 = 有符号类型 int -37

00000000 00000000 00000000 11111111 = 0x000000FF的掩码

00000000 00000000 00000000 11011011 = & 运算结果219

最终结果219

其他参考

原理:(出处:https://www.jianshu.com/p/db85f033e75c)

正如上述我们看到的代码所示:

int luminance = row[x] & 0xFF;

首先widening类型。将byte声明为short或者int类型。然后与0xFF取&即可。

下面,具体说明这样做的原理。

0xff 表示为二进制就是 1111 1111。在signed byte类型中,代表-1;但在short或者int类型中则代表255.

当把byte类型的-1赋值到short或者int类型时,虽然值仍然代表-1,但却由1111 1111变成1111 1111 1111 1111.

再将其与0xff进行掩码:

-1: 11111111 1111111

0xFF: 00000000 1111111

255: 00000000 1111111

所以这样,-1就转换成255.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值