Java:从char减去'0'得到一个int ...为什么这个工作?

时间:2010-11-30 20:31:08

标签: java

这很好用:

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

然而这不是 - 因为bar.charAt(x)返回一个char:

int foo = bar.charAt(1);

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

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

9 个答案:

答案 0 :(得分:32)

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

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

答案 1 :(得分:12)

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

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

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

答案 2 :(得分:2)

以下代码完美无缺!

int foo = bar.charAt(1);

与引用类型类似,可以分配任何Java基元而不转换为被视为子类型的另一个基元。基元的子类型规则由JLS section 4.10.1给出。 char被视为int的子类型,因此任何char都可以分配给int

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

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

你会发现这也有效

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

答案 6 :(得分:0)

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 ...,这是因为它不起作用?

答案 7 :(得分:0)

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

int foo = bar.charAt(1);

char,就像shortbyte一样,如果需要,将始终默默地投放到int

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

答案 8 :(得分:0)

如果人们忽略了他的评论,我会回应@马克·彼得斯的讲话。

我引用: ” 不要误以为'0'==0。实际上,'0'== 48 “