解密java中的类型转换问题

     2022-03-14     175

关键词:

众所周知Java中的数据类型是强数据类型,基本数据类型之间的转换尤其固定的规则,当数据宽度比较窄的数据类型(如int)转换成数据类型比较宽的数据类型时(如double),则窄的数据类型会加宽,可以完成自动类型转换,这称为隐式转换。

    如:以下代码没有任何问题,结果也是正确的,成绩不会发生变化,所不同的是成绩的精度提高了。

intintScore = 96;
doubledoubleScore = intScore;

    那么如果试图把宽的数据类型(如double)转换成窄的数据类型(如float)时,编译器会提示编译错误,想要编译通过,需要进行强制类型转换。那么,此时的数据会发生截断。产生的结果是:

1. 数据正确,只是精度降低了;

2. 数据不正确,发生了溢出;

对于上述第1种情况,比较好理解,我们来看个例子:

float floatWeight= 63.5; //编译错误
double doubleWeight= 63.5;

上述第一条语句会提示编译错误,那是因为编译器看到63.5时,会把它当做一个double类型,把一个double类型赋给float类型,当然编译不通过了。推荐的解决方案是:

float floatWeight = 63.5f;

当然,你也可以强制转换成float类型:

float floatWeight = (float)63.5;

其实,上述语句本质是把double类型的数据强制转换成float类型,发生了截断。虽然数据的大小没有变化,但是数据的精度却降低了。

同理:

doubleWeight = floatWeight; //隐式转换
floatWeight = (float)doubleWeight;//强制转换

现在,问题来了,既然是截断,怎么会产生溢出呢?我们先来看个例子:

shorti = 150;
shortj = 75;
byteb = (byte) i; 
byted = (byte) j; 
System.out.println("b = " + b);
System.out.println("d = " + d);

以上代码的输出结果是:

b = -106

d = 75

看到结果,不免会问为什么b=-106呢?这是因为强制转换时发生溢出。由于150超出了byte能够表示的最大范围(-128 ~ 127)。

那么-106又是如何得来的呢?

i = 150,用二进制表示i = 0000 0000 1001 0110short类型占2个字节,16位,最高位的0表示正数。当把i强制转换成byte类型时,高位发生截断,i = 1001 0110。在计算机中,用补码表示,最高位的1表示负数,那么用原码表示的话:i = 1110 1010,正好表示十进制数-106

至此,也就解释了为什么截断也可能会发生溢出。


本文出自 “心飞翔” 博客,请务必保留此出处http://weiweili.blog.51cto.com/6675651/1901017

java中的Aes解密-填充问题

】java中的Aes解密-填充问题【英文标题】:Aesdecryptioninjava-problemswithpadding【发布时间】:2016-09-0302:15:41【问题描述】:我想用java实现一个简单的加密/解密工具。因此我找到了一个小教程:http://www.codejava.net/coding/file-encryption-and-de... 查看详情

某些 Java 泛型类型转换中的类型安全警告是啥意思?

】某些Java泛型类型转换中的类型安全警告是啥意思?【英文标题】:WhatisthemeaningofthetypesafetywarningincertainJavagenericscasts?某些Java泛型类型转换中的类型安全警告是什么意思?【发布时间】:2008-08-0208:58:27【问题描述】:Java警告是... 查看详情

如何使用对称密钥加密和解密 SQL Server 中的整数数据类型列

】如何使用对称密钥加密和解密SQLServer中的整数数据类型列【英文标题】:HowtoencryptanddecryptintegerdatatypecolumninSQLServerusingsymmetrickey【发布时间】:2018-12-3107:32:59【问题描述】:我可以使用对称密钥加密和解密varchar、nvarchar、char列... 查看详情

Java Cipher 解密中的奇怪字符

】JavaCipher解密中的奇怪字符【英文标题】:JavaCipherStrangecharsindecryption【发布时间】:2016-06-2310:15:20【问题描述】:我的程序有一个奇怪的问题,我想加密一些字符串然后解密它们;我做了一个试用类来测试加密和解密的功能。... 查看详情

关于java中的short和int类型转换的问题

...没看明白这些转换是怎么运行的,求大神指点。。。java中的short和int类型转换,当将一个数值范围小 查看详情

Java中的RSA加密/解密

】Java中的RSA加密/解密【英文标题】:RSAEncrypt/DecryptinJava【发布时间】:2011-12-1004:53:57【问题描述】:我是密码学的新手。我获得了一个base64格式的RSA公钥。有没有办法只使用公钥加密一些文本。我也需要模数/指数吗?任何指针... 查看详情

Java中的Apple Pay支付令牌解密

】Java中的ApplePay支付令牌解密【英文标题】:ApplePayPaymentTokenDecryptioninJava【发布时间】:2019-09-2001:26:43【问题描述】:我正在尝试在服务器端使用Java中的ECC算法解密ApplePay支付令牌中的data字段。如何实现?我在Java中寻找这样的... 查看详情

Java 中的 AES 128 加密 PHP 中的解密

】Java中的AES128加密PHP中的解密【英文标题】:AES128encryptioninJavaDecryptioninPHP【发布时间】:2013-10-1208:48:41【问题描述】:我一直在尝试使用最初使用JAVAAES加密进行加密的AES-128CBC解密字符串。在javaPKCS7中使用填充。我曾尝试使用... 查看详情

java:不兼容的类型:T 无法转换为 java.lang.String

...】:我目前正在使用GoogleTink为我的应用程序提供加密和解密服务。问题如下:我想在不使用(几乎)重复代码的情况下对其进行编程,因此我有了使用泛型的想法。如果将字符串解析为b 查看详情

java中的类型转换

JAVA中类型转换的基本原则在于,(布尔型除外,无法转换)低精确度或者说小范围的类型可以自动地转为高精度或者大范围的类型,反之则需要强制转换。如图所示,左边的类型可以自动转换为右边的类型(一般发生在与大范... 查看详情

2-5:java中的类型转换

...运行结果为:82.0 这种转换称为自动类型转换。2.Java中的自动类型转换是需要满足特定的条件的:目标类型能与源类型兼容,如double型兼容int型,但是char型不能兼容int型。即同类型可以自动转 查看详情

java中的类型转换

在Java程序中,不同的基本数据类型的数据之间经常需要进行相互转换。例如:, 代码中int 型变量score1 可以直接为double型变量score2完成赋值操作,运行结果为: 82.0 这种转换称为自动类型转换。当然自动类型... 查看详情

sqlserver类型与java类型转换问题解决

...了获得最大的可移植性,应该按从左到右的顺序读取每行中的结果集列,每列只能读取一次。对于获取方法,JDBC驱动程序尝试将底层数据转换为在获取方法中指定的Java类型,并返回适当的Java值。JDBC规范有一个表 查看详情

关于java中任意对象强制转换为接口类型的问题

  java中任意对象强转为接口类型都不会有编译错误publicclassAppleimplementsEatable{publicstaticvoidmain(Stringargs[]){Drinkabledrinkable=(Drinkable)newApple();}}interfaceEatable{}interfaceDrinkable{}  java中的类可以多实现接口,Java编译器 查看详情

java中的各种数据类型的转换

整型、浮点型、数字可以进行混合运算的。在运算中,不同的类型会先转换为同一类型,然后再进行计算。一、隐式类型转换(自动类型转换)隐式类型转换(自动类型转换)规则:1、小的类型自动转... 查看详情

AES GCM 解密绕过 JAVA 中的身份验证

】AESGCM解密绕过JAVA中的身份验证【英文标题】:AESGCMdecryptionbypassingauthenticationinJAVA【发布时间】:2018-08-2002:03:50【问题描述】:我有一些AES/GCM加密数据并想对其进行解密。我想绕过身份验证对其进行解密,因为数据不包含身份... 查看详情

java中的类型转换关系

publicclassA3{ publicstaticvoidmain(String[]args){ inti1=123; inti2=456; doubled1=(i1+i2)*1.2;//默认存在一个自动类型转换,先将int类型装环为double型在进行运算。 System.out.println(d1); //会把1.2认为是double,所有需要强制类型转换 floatf1=(i1+i2 查看详情

Java 中的 Vigenere 密码算法 - 将消息解密为明文

】Java中的Vigenere密码算法-将消息解密为明文【英文标题】:VigenereCipherAlgorithmInJava-DecryptedMessagetoPlaintext【发布时间】:2020-10-0321:53:56【问题描述】:我目前正在尝试用Java编写VigenereCipher算法。我必须将解密的消息更改为明文,... 查看详情