整数值会产生意外结果

时间:2016-02-28 13:27:18

标签: 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(0));
    }
}

它给了我结果:

Int value: 49
String value: 1

让我感到困惑,因为x = "1234",所以当它运行第四行时,结果应该与:

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

理论上应该给我:Int value: 1

那么是什么原因导致结果为49

7 个答案:

答案 0 :(得分:7)

之间存在差异
System.out.println("Int value: " + Integer.valueOf(1));

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

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

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

请注意' 1'作为字符而不是整数传递。结果,Integer.valueOf返回字符' 1'的ASCII值,即49。

请参阅ASCII table查看。

答案 1 :(得分:3)

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

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

尝试使用int x = Integer.parseInt("1234");代替

答案 2 :(得分:1)

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

A link to an ASCII table that shows you how a given character maps to a given decimal

答案 3 :(得分:1)

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

答案 4 :(得分:1)

这是因为您打印的ASCII值为1。

尝试Character.getNumericValue(char)

尝试此操作(对您的实施进行最小的更改):

package general;

class CharToInt
{
public static void main(String[] args) {
      String x = "1234";

      System.out.println("Int value: " + Character.getNumericValue(x.charAt(0)));
      System.out.println("String value: " + x.charAt(0));
    }
}

答案 5 :(得分:1)

你需要做的是传递一个字符串" 1" into方法" Integer.valueOf()"然后它会将其解析为整数1.为此,你可以这样做

String x = "1234"; System.out.println("Int value: " + Integer.valueOf(s.substring(0,1));

答案 6 :(得分:1)

有一件事是你如何看待传递给函数的参数,但第二件事是这个参数的类型是什么。

x.charAt(0) returns '1' 

但必须记住,类型是字符

所以,实际上它会返回二进制数据,例如:00110001,其中一个可以像0x31(hex)那样读取49(dec)什么是字符'1'的UTF-16表示

现在......功能:

Integer.valueOf( )

它将数字视为参数,因此它需要那些二进制数据00110001并将其读作普通数字......它的值为49