Java:从char中减去’0’得到一个int …为什么这个工作?

这很好用:

int foo = bar.charAt(1) - '0'; 

但这不是 – 因为bar.charAt(x)返回一个char:

 int foo = bar.charAt(1); 

似乎从char中减去’0’会将其转换为整数。

为什么或如何减去字符串’0’(或者它是char?)将另一个char转换为整数?

这是一个聪明的伎俩。 char实际上与短裤的类型/长度相同。 现在当你有一个表示ASCII / unicode数字(如’1’)的字符,并从中减去最小的ASCII / unicode数字(例如’0’),那么你将留下数字的相应值(因此,1)

因为char与short相同(尽管是unsigned short),所以可以安全地将它转换为int。 如果涉及算术,则铸件总是自动完成

这是一个旧的ASCII技巧,适用于从’0’开始按顺序排列数字’0’到’9’的任何编码。 在Ascii中,’0’是一个值为0x30且’9’为0x39的字符。 基本上,如果你有一个数字的字符,减去’0’“将”转换为它的数字值。

我不得不同意@Lukas Eder并暗示这是一个可怕的伎俩; 因为这个动作的意图从代码中明显看出0%。 如果您使用Java并且包含包含数字的String并且您想将该String转换为int我建议您使用Integer.parseInt(yourString);

这种技术对于未来的维护程序员来说具有明显的优点。

以下代码完美无缺!

 int foo = bar.charAt(1); 

与引用类型类似,任何Java原语都可以在不转换为类型的另一个原语的情况下进行分配,它被视为子类型。 基元的子类型规则由JLS第4.10.1节给出。 char被认为是int的子类型,因此任何char都可以分配给int

'0'也是一个字符。 事实certificate,Java中的字符具有unicode(UTF-16)值。 当您使用-运算符和字符时,Java使用整数值执行操作。

例如, int x = '0' - 'A';// x = 16

您的代码可以在没有错误的情况下编译并运行而不会抛出exception,但在char和int之间进行转换是不好的做法。 首先,它使代码混乱,导致维护头痛。 其次,聪明的“技巧”可以阻止编译器优化字节代码。 获得快速代码的最佳方法之一是编写代码(即,不是聪明的代码)。

因为在Java中如果没有指定带有数字的类型指示符,那么它将采用Integer。 我的意思是,如果要设置Long值,则需要为0L。

对两个不同的数字执行数值运算,结果需要更大。 因此,char(其为数值)减去整数,得到整数。

你会发现这也有效

 long val = bar.charAt(1) - 0L; 

char隐式转换为int

  public static void main(String [] args) throws Exception { String bar = "abc"; int foo = bar.charAt(1) - '0'; int foob = bar.charAt(1); System.err.println("foo = " + foo + " foob = " + foob); } 

输出: foo = 50 foob = 98

也许你把两个int foo ...这是因为它不起作用?

你的第二个剪辑应该工作正常:

 int foo = bar.charAt(1); 

如果需要, char (就像shortbyte )将始终以静默方式转换为int

这将编译得很好: int i = 'c';