日期:2014-05-20  浏览次数:20701 次

java中如何转换C++中的无符号类型?
现在需要java端接收c++的unsigned int型,网上说需要转为long型,那么怎么互相转换呢,还有unsigned byte转为java 的int型, 

------解决方案--------------------
如果只是互相通信,感觉没有转换的必要(只是多个符号位而已,也就是发送正数还是负数的问题)
如果为了表示而转换,可以通过二进制的与或非和移位运算来进行

------解决方案--------------------
不用转吧int也不小啦
------解决方案--------------------
个人感觉毫无意义。首先一点,数据在内存里是二进制表示的,本身就是一个抽象。而对于我们运算而言,只不过是把这种抽象转化成我们的熟悉的方式了。比如说-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型数不足以表示全部范围,那绝对是设计问题。
------解决方案--------------------
是这样的
如: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);//哈哈,这样就可以了