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
(就像short
或byte
)将始终以静默方式转换为int
。
这将编译得很好: int i = 'c';