java 整型减去字符_Java:从char中减去’0’得到一个整数……为什么这个有效?...

这工作正常:

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

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

int foo = bar.charAt(1);

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

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

不要误以为0 == 0。 实际上是0 == 48。

单击啊,现在很合理了! 如果仅您将其作为答案并指向cs.utk.edu/~pham/ascii_table.jpg

该隐式强制转换不会返回char的小数表示形式(如@MarkPeters所指出的),因此,例如,如果bar.charAt(1)返回A,即dec表示形式为65,则int foo将为17,A-0 = 65-48 = 17,而不是65。

Leetcode中的许多问题都使用了这个技巧,但是我看不到有人问过这个技巧如何处理Leetcode的问题。

这是一个聪明的把戏。字符实际上与短裤的类型/长度相同。现在,当您有一个表示ASCII / Unicode数字(例如" 1")的字符,并从中减去最小的ASCII / Unicode数字(例如" 0")时,将剩下该数字的对应值(因此1)

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

短裤可以具有负值,char不可以。也不是ASCII而是unicode(虽然很小但很重要):尝试int y = \uffff - \ufffe;

你是对的。对于数字,ASCII和Unicode码恰好重合,这就是为什么我首先想到ASCII的原因

那很棒。我确实需要马克·彼得斯发表评论,以使我认识到,用相应的值表示我实际上是从49-57中减去48。另外,我得到的错误实际上是数组异常,所以也许我的问题会误导第一个示例"无效"。谢谢! :)

是的我们一起做这个解释工作:-)

需要明确的是,char在Java中不被视为short的子类型...您的回答听起来像是。 char和short都是int的直接子类型。同样,"转换"在任何类型和被认为是其超类型的任何类型之间自动完成,而不管是否涉及算术。

这是一个古老的ASCII技巧,适用于从" 0"开始按顺序排列数字" 0"至" 9"的任何编码。在Ascii中," 0"是值为0x30的字符,而" 9"是0x39。基本上,如果您有一个数字字符,则减去" 0"会将其转换为数字值。

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

这项技术的好处对将来的维护程序员来说是显而易见的。

如果您想知道,这也是EBCDIC的老把戏。

这是一个聪明的把戏。聪明总是一件坏事。与优雅相反:-)

以下代码可以正常运行!

int foo = bar.charAt(1);

与引用类型相似,可以将任何Java原语分配给它,而不必强制转换为另一个被视为其子类型的原语。 JLS第4.10.1节给出了基元的子类型化规则。 char被视为int的子类型,因此可以将任何char分配给int。

你确定吗? String s ="9"; int n = s.charAt(0); System.out.println(n);返回57

您的代码可以编译而不会出错并且可以在不引发异常的情况下运行,但是在char和int之间进行转换是不好的做法。首先,它会使代码混乱,从而导致日后的维护麻烦。其次,聪明的"技巧"可能会阻止编译器优化字节码。获得快速代码的最佳方法之一是编写哑代码(即,不是聪明的代码)。

'0'也是一个字符。事实证明,Java中的字符具有Unicode(UTF-16)值。当您将-运算符与字符一起使用时,Java将对整数进行运算。

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

它根本不抱怨。您可以很好地执行int y = s.charAt(1),而不会出现编译或运行时错误(假设s具有两个+字符)。我认为OP对于为何未返回相同结果感到困惑。

@Bart:UTF-16是unicode的编码格式,但是您是正确的。

@Mark:我知道,但是对于unicode点65k以上的字符,(至少)使用了两个UTF-16字符

您选择了一个很好的例子来说明字符算术的有限用途。

您的第二个片段应该可以正常工作:

int foo = bar.charAt(1);

像short或byte一样,char始终会在需要时静默转换为int。

这样可以很好地编译:int i = 'c';

不,0不是零。

并不是说,只是您不需要将char显式转换为int,因此尚不清楚为什么searbe需要减法。

不,如果我有一个" char c = bar.charAt(1); // c = 1;"然后" int foo = c;" foo将是49而不是1。所以减去" int foo = c-0;返回1. :)因为49-48 = 1

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

因为在Java中,如果您不使用数字指定类型指示符,则它将采用Integer。

我的意思是,如果要设置Long值,则必须为0L。

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

您会发现这也有效

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

@卢卡斯,它不会,看到我的答案。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值