关于java char,int,互转的问题
2016-08-30 00:00
405 查看
今天在做数据验证的时候出现一个诡异的问题:例如,有一个字符串"今天在做数据验证的时候出现一个诡异的问",这个字符串按字符异或得出值为-32,把-32强转为char类型作为字符串的校验位进行传输,接收到以后-32对应的字符转换为int类型却是65504。虽然当时就找到解决方式,但还是没有弄明白。经过一个上午的调查,线把原因整理如下:
首先:我们知道java中char占位两个字节,short占位两个字节,int占位4个字节,long占位8个字节。
其次:我们需要了解,在计算机结构中整数是以补码的方式存储的,至于为什么这么存储这里就不说了;正整数的补码是其本身,负整数的补码是其2进制位除符号位以为的每一位取反,并加1。
第三:java中char类型是以无符号整数表示的。这是我偶然看到的,怪自己粗心。
下面我们看一看数据结构
-32对应的int存储结构为:11111111111111111111111111100000(4个字节32位)
强转为char类型存储结构为:1111111111100000(2个字节16位),可见强转后是截取了int类型的低16位。
接下来接收者在接收到以后取到校验字符,强转为int类型存储结构为:1111111111100000(2个字节16位)。这里是没有问题的,问题在于把这个值与重新计算的校验值比较就不对了,因为从char类型强转为int类型,java默认该值为一个无符号整形(虽然java里面没有这个概念)存储结构为00000000000000001111111111100000,这里就很清楚了,该值为65504。
事实上原因在于int与char之间存储结构的差异,若按字符异或完成后,把int转为char比较就不存在问题了。
强转有风险,使用需谨慎!
首先:我们知道java中char占位两个字节,short占位两个字节,int占位4个字节,long占位8个字节。
其次:我们需要了解,在计算机结构中整数是以补码的方式存储的,至于为什么这么存储这里就不说了;正整数的补码是其本身,负整数的补码是其2进制位除符号位以为的每一位取反,并加1。
第三:java中char类型是以无符号整数表示的。这是我偶然看到的,怪自己粗心。
下面我们看一看数据结构
-32对应的int存储结构为:11111111111111111111111111100000(4个字节32位)
强转为char类型存储结构为:1111111111100000(2个字节16位),可见强转后是截取了int类型的低16位。
接下来接收者在接收到以后取到校验字符,强转为int类型存储结构为:1111111111100000(2个字节16位)。这里是没有问题的,问题在于把这个值与重新计算的校验值比较就不对了,因为从char类型强转为int类型,java默认该值为一个无符号整形(虽然java里面没有这个概念)存储结构为00000000000000001111111111100000,这里就很清楚了,该值为65504。
事实上原因在于int与char之间存储结构的差异,若按字符异或完成后,把int转为char比较就不存在问题了。
强转有风险,使用需谨慎!
相关文章推荐
- 关于Java中byte,short,char,int 之间相互赋值的问题
- Android 中java 关于字符串与整形转换的相关问题(Invalid Int)
- java学习---char和int的类型转换问题
- Java中char和int类型的转换问题
- 关于Java中char,int的互转
- 类型转换问题(java会把byte,short和char的运算操作转换为int类型即低精度自动向高精度转换)
- 关于java中float和int 精度和范围的问题
- java中char与int的转换问题
- 关于int类型指针和char类型指针相互转换问题
- iBaits中,关于insert返回值的问题(注意!!!不必写resultClass= "java.lang.Integer",方法的返回值就是int)
- c/c++和java中关于char的长度问题
- java中关于char[]数组输出问题
- 关于imustworkhard的IntToBin(2-16进制转换函数)的效率问题
- Java 关于中文乱码问题的解决方案与经验 (1)
- Java 关于中文乱码问题的解决方案与经验
- Java 关于中文乱码问题的解决方案与经验(转)
- JAVA与C++::关于JNI中文字符串操作问题总结
- Java 关于中文乱码问题的解决方案与经验【转载】
- 关于Java文件路径问题(原创+转贴)
- Java 关于中文乱码问题的解决方案与经验