社区
Java SE
帖子详情
java中如何转换C++中的无符号类型?
xinglongjian
2011-03-24 09:36:45
现在需要java端接收c++的unsigned int型,网上说需要转为long型,那么怎么互相转换呢,还有unsigned byte转为java 的int型,
...全文
573
5
打赏
收藏
java中如何转换C++中的无符号类型?
现在需要java端接收c++的unsigned int型,网上说需要转为long型,那么怎么互相转换呢,还有unsigned byte转为java 的int型,
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
ouyangshixiong
2013-06-19
打赏
举报
回复
4楼是错的,最后一行正确时的: b=(0xffffffffL&b); 为什么要加L因为这里是long和long的运算,否则默认是int,int和long运算要自动类型转换为long,就不能去除高位的符号位。
wenbodong
2011-03-24
打赏
举报
回复
是这样的
如:C++中的unsigned long,无符号的long型,如果是VC的话,应该是4个字节,只不过由于它是无符号的,所以它的补码就是原码,表示范围是0-2^32-1. 那么Java程序接收时,也会接收到一个4字节的东西.但是,由于这个是四字节,无符号.所以很有可能,它的第31位(第0位是最低位)是1,而Java接收到这个,如果给int型的话,Java的int就是有符号的,最高位是1,表示是负数,这样就产生了问题(当然,如果最高位不是1,就没有问题).现在假设这个值已经给一个int了
int a=...;//Java的a中已经接收了这个unsigned long,并且最高位是1,所以变成了负数
long b=a; //将a转换为long型,由于它是负数,所以它的符号位会填充到long的高32位中.你现在只需要做一件事情况:
b=(0xffffffff&b);//哈哈,这样就可以了
ssd189
2011-03-24
打赏
举报
回复
个人感觉毫无意义。首先一点,数据在内存里是二进制表示的,本身就是一个抽象。而对于我们运算而言,只不过是把这种抽象转化成我们的熟悉的方式了。比如说-1,内存里就是11111111(byte大小),如果解释为有符号,结果是-1,如果解释为无符号,结果就是11111111(即255)。其实质是一样的,只不过看你怎么解释了。而对于所有问题,有符号的方式就足够了,感觉C++里面增加这种冗杂的特性是多此一举。
楼主的这个问题就是这样,你首先将信息拿来,剩下的就是怎么解释的问题了。如果数值不大,2楼的当然可行,但是不够通用。事实上,使用java类库应该可以搞定。如果只是通信,完全可以转化为字符串,即Integer.toBinaryString(i),Integer类库里的,自己查。如果还要计算,起码首先是个设计问题了,在此不再赘述。感觉应该也有类库,即表示抽象二进制序列的类库,但我不知道,自己查。这里来个不怎么面向对象的方式,首先先将所给形式转化为long型,当然不是直接转化,因为符号是不会转化的。分两种情况:
1.正数直接化为long;代码为 longnum = messagenum;
2.对于负数,记住其相反数(一个正数)与它代表的无符号值之和是一个常数,即2的32次方。即-1代表2的32次方-1,-2代表2的32次方-2,等等。(你所要的值=2的32次方-int型负数的相反数)。代码为longnum = (2点32次方,你先求出这个数,将它化为long型常数,千万不要使用Math.pow,结果是double,谁也不能保证其值是精确的) + minusnum;
这里再次解释一下2楼的所说,即int也不小了。如果只是通信,那就使用toBinaryString即可;如果是用于计算,虽然我上面说了一个方法,但我觉得2楼的这种简单考虑是很有道理的。因为给来的数是int型的,如果还要考虑负数形式(对应无符号数是较大数了),难保不会有溢出。当然转换为long不会了,不过它的原始类型是int的,至少在楼主所要使用的C++程序里(为什么要搞两种语言的冗杂?),它是的。也就是说它并没有要转化为long型求值的意思。如果它还要表示较大的数,而且还要求值,谁能保证不会溢出;如果只是表示范围不大的数,java里的int就足够了,无需转化为long型。
综述:1.如果只是用于信息表示,直接转化为二进制字符串;
2.如果还要求值,直接用int型表示;这个时候int型数不足以表示全部范围,那绝对是设计问题。
zqfddqr
2011-03-24
打赏
举报
回复
不用转吧int也不小啦
qybao
2011-03-24
打赏
举报
回复
如果只是互相通信,感觉没有转换的必要(只是多个符号位而已,也就是发送正数还是负数的问题)
如果为了表示而转换,可以通过二进制的与或非和移位运算来进行
无符号
类型
java
_
java
的基本数据
类型
是
无符号
的
java
的基本数据
类型
是
无符号
的真是惭愧啊, 学了怎么久
java
, 现在才知道
java
的基本数据
类型
是不存在有符号和
无符号
这种东西的. 平时都没有搞字节和位之类的运算, 所以倒是没有注意到这个方面呢.
JAVA
中
的基本数据
类型
不存在
无符号
的,它们的取值范围是固定的,不会随着机器硬件环境或者操作系统的改变而改变。(这句抄的)
Java
简单数据
类型
简单
类型
大小 范围/精度float 4...
Java
socket传输
无符号
类型
数据到
C++
应用程序
背景 : 项目程序
中
用到需要socket 传输指令到
C++
程序
中
,需要TCP 的连接方式。 所以就想到用socket 来连接 。 问题:
c++
接收字节和字节的大小都是有严格要求的, 需要传输规定长度的
无符号
的指令。那么问题来了,
Java
程序
中
byte
类型
都是有符号的,长度在-128 到127之间。 而
C++
中
可以定义 unsigned char 设置
无符号
数据
类型
。 ...
java
中
无符号
类型
的解决方案
在
Java
中
,不存在Unsigned
无符号
数据
类型
,但可以轻而易举的完成Unsigned
转换
。 方案一:如果在
Java
中
进行流(Stream)数据处理,可以用DataInputStream类对Stream
中
的数据以Unsigned读取。
Java
在这方面提供了支持,可以用
java
.io.DataInputStream类对象来完成对流内数据的Unsigned读取,该类提供了如下方法: (1)i
Java
接收 C/
C++
无符号
int数值的方法
由于C/
C++
无符号
整型int四字节大小,而
JAVA
只有有符号int,所以
JAVA
中
的int不可以直接接收C/
C++
无符号
整型int,需要用long来接收。但是用long来接收的话字符序列需要
转换
,高低位互换,可以用JDK里面Integer的reverseBytes()方法来进行互换: Integer.reverseBytes((int)ReceiveNum)&0xFFFFFFFF...
java
无符号
整型_
Java
-
java
中
无符号
类型
的处理
在
Java
中
,不存在Unsigned
无符号
数据
类型
,但可以轻而易举的完成Unsigned
转换
。方案一:如果在
Java
中
进行流(Stream)数据处理,可以用DataInputStream类对Stream
中
的数据以Unsigned读取。
Java
在这方面提供了支持,可以用
java
.io.DataInputStream类对象来完成对流内数据的Unsigned读取,该类提供了如下方法:(1)int r...
Java SE
62,628
社区成员
307,259
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章