首页 > 编程知识 正文

java强制类型转换int(java int转无符号_Java 中使用无符号整型(unsigned int)的使用方法)

时间:2023-05-06 04:18:19 阅读:122191 作者:3217

背景

计算机科的毕业生大多学过离散数学,或者理工科的专家也多学过c和c语言。 由此可见,基本类型的整形有短、长、长等,分别有无符号(unsigned )和有符号),但并不是所有语言都支持无符号。 Java就是这样的语言。

但是在工程实践中,有时会使用无符号整数。 例如,加密算法等通常会进行多次位运算。 在这种情况下,位运算要求无符号。

本文介绍了笔者的一些经验。 在这期间,我把某个c代码翻译成了Java代码。 在此过程中,我会总结一点经验,并记录在这里。 大家有更好的方法。 欢迎留言交流。 笔者随后发现了新的简洁方式,本文也将进行更新。

Java的新版本引入无符号。 不支持这种无符号设计本身就不是非常明智的决定。

使用无符号

无符号右移

当前,在无符号支持中,Java仅支持位运算的右移位特殊符号,并支持右移位,忽略符号位并将其填充为0。 但是,这在实践中是不够的,在很多场景中是不能满足的。

类型升级支持

当前,为了获得无符号效果,当前方法只能进行类型升级。 byte和short转换为int,int转换为long,并且运算只保留与原始类型的位数匹配的位数。 因为自己的Java定义了每种类型的长度,所以在跨平台上使用也没有问题。

//unsigned注释:因为java没有unsigned,所以为了实现unsigned,需要使用比原来的类型大的类型,通过位运算取得该unsigned的值

//unsigned byte短整型,unsigned int - long

私有统计数字签名字节(字节) {

返回b0x0ff;

}

隐私保护客户端

返回数据0x 0f fff;

}

隐私保护客户端插件{

//data0xFFFFFFFF和data0xFFFFFFFFL的结果不同,需要注意,可能与JDK版本有关

返回数据0 xffffffff l;

}

bytes类型转换

通常,无符号位运算结束时,bytes会转换为字符串或数字类型。 Java支持这种转换。 标准库支持相应的API。

int/long与bytes的相互转换

类型之间的转换也是常见的操作,在c中,这种技术通常用于将四个char数组组合为一个int。

Java的这一支持仍然很友好,nio有字节缓冲器。 需要注意的是大端和小端的选择。 这与系统密切相关,一般大多数系统都是小端序。

短整型、整型、长整型等类型可以通过类似的API与字节进行交互转换。 请注意,三种类型的字节在每个系统上是固定的,并且由Java语言规范定义。

import java.nio.ByteBuffer;

import java.nio.ByteOrder;

byteorder order=byteorder.little _ endian;

//长

long l=2147483648L;

byte [ ] bytes=byte buffer.allocate (8).order ).putLong(l ) l ).array );

longdata=bytebuffer.wrap(bytes,0,bytes.length ).order ).getLong );

//int

int i=123456;

byte [ ] bytes=byte buffer.allocate (4).order ).putInt(i ) I ).array );

intdata=bytebuffer.wrap(bytes,0,bytes.length ).order ).getInt );

//短整型

短整型=32767;

byte [ ] bytes=byte buffer.allocate (2).order ).putShort(s ) s ).array );

intdata=bytebuffer.wrap(bytes,0,bytes.length ).order ).getShort );

字符串和字节的相互转换

String有一种称为getBytes的方法,可以检索bytes数组。 但是,请注意,Java内部的字符编码是UTF16,而不是UTF8。

另一个需要注意的是,getBytes可以传递字符编码。 这个最好明确指定。 否则,使用系统默认值。 这在某些环境下行为不一致,可能会引起可疑的错误,很难定位解决方案。

bytes还很容易转换为String,并且String构造函数直接支持。

import java.nio.charset.Charset;

charset charset=charset.forname (utf-8 );

字符串数据=' ABC ';

byte [ ] bytes=data.getbytes (charset );

stringnewdata=newstring(Bytes,0,bytes.length,charset );

结尾曲

以上是我个人的经验,笔者通过使用上述方法,比较顺利地进行了将代码翻译成Java的工作,并通过了测试。

希望你能帮助有需要的朋友。 欢迎进行信息讨论。

扩展阅读

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。