Java 的整数值给出了意外的结果

Java 的整数值给出了意外的结果,java,Java,在做我的一个项目时,我遇到了一个问题 当我运行以下程序时: public class test { public static void main(String[] args) { String x = "1234"; System.out.println("Int value: " + Integer.valueOf(x.charAt(0))); System.out.println("String value: " + x.charAt

在做我的一个项目时,我遇到了一个问题

当我运行以下程序时:

public class test {
    public static void main(String[] args) {
        String x = "1234";
        System.out.println("Int value: " + Integer.valueOf(x.charAt(0)));
        System.out.println("String value: " + x.charAt(0));
    }
}
结果是:

Int value: 49
String value: 1
这让我感到困惑,因为
x=“1234”
,所以当它运行第四行时,结果应该与以下相同:

System.out.println("Int value: " + Integer.valueOf(1));
理论上应该给我:
Int值:1


那么是什么导致结果变成
49
呢?

这是因为下面返回的是UTF-16值,而不是值本身

        System.out.println("Int value: " + Integer.valueOf(x.charAt(0)));

尝试使用
intx=Integer.parseInt(“1234”)相反

System.out.println("Int value: " + Integer.valueOf(1));

在第二行,真正发生的是-

System.out.println("Int value: " + Integer.valueOf('1'));
请注意,“1”是作为字符而不是整数传递的。因此,Integer.valueOf返回字符“1”的ASCII值,即49


请参阅以自行查看。

49是对应于ASCII字符“1”的十进制值。看看这个图表,看看对应于Chr(字符值)“1”的“Dec”(十进制值)列


您使用了函数
valueOf(String s)
,而不是
valueOf(int i)
。表示它“返回一个包含指定字符串值的整数对象。”。这意味着,该函数返回符号“1”的ASCII码,即49。

这是因为您正在打印1的ASCII值

试一试

尝试以下方法(对您的实现进行最小的更改):


您需要做的是将字符串“1”传递到方法“Integer.valueOf()”中,然后将其解析为整数1。要做到这一点,你可以这样做

String x=“1234”;

System.out.println(“Int-value:+Integer.valueOf(s.substring(0,1));

一件事是如何看待传递给函数的参数,但第二件事是此参数的类型

x.charAt(0) returns '1' 
但必须记住,类型是字符

因此,实际上它返回二进制数据,如:
00110001
可以读取的数据,如
0x31(十六进制)
什么是
49(dec)
字符的UTF-16表示形式
'1'

现在…函数:

Integer.valueOf( )

它期望该数字作为参数,因此它接受那些二进制数据
00110001
,并像读取普通数字一样读取它…它的值为49

,更准确地说,它是UTF-16代码单位值,而不是ASCII。它与“1”相同,虽然如此,但这仍然是一个非常重要的区别。现在这个答案是最正确的,它可以通过无处不在的字符表链接进行四舍五入:,。事实恰恰相反,它使用字符“1”并将其解释为整数,从而返回整数ascii码“1”,即49。因此,在原始的有问题的代码使用的方法是
valueOf(inti)
x.charAt(0) returns '1' 
Integer.valueOf( )