当前位置: 首页 > 面试题库 >

加减运算符为什么起作用?(java)

白坚壁
2023-03-14
问题内容

我正在通过Daniel liang在第9章“字符串”中的“ Java编程第9版简介”来学习Java,我遇到了这段代码:

    public static int hexCharToDecimal(char ch){
       if (ch >= 'A' && ch <= 'F')
           return 10 + ch - 'A';
       else
          return ch - '0';
}

好吧,有人可以解释一下这里发生了什么吗?如何从整数中添加子字符,其背后的含义是什么,谢谢。


问题答案:

来自文档

char数据类型是单个16位Unicode字符。

A char由其代码点值表示:

  • 分钟'\u0000'(或0)
  • 最多:('\uffff'或65,535)

您可以在ASCII表上看到所有英文字母代码点。

请注意,0 == \u000065,535 == \uffff,以及之间的所有内容。它们是对应的值。

char实际上,A 仅存储为数字(其代码点值)。我们有语法来表示像char c = 'A';这样的字符,但它等效于char c = 65;并且'A' == 65为true。

因此,在您的代码中,字符用其十进制值表示以进行算术运算(整数从0到65,535)。

例如,char 'A'由其代码点65(ASCII表中的十进制值)表示:

System.out.print('A'); // prints A
System.out.print((int)('A')); // prints 65 because you casted it to an int

请注意,a short是一个16位有 符号 整数,因此即使a
char也是16位,a的最大整数值char(65,535)仍超过a的最大整数值short(32,767)。因此,(short)从a强制转换为char不能始终有效。并且a的最小整数值为char0,而a的最小整数值为short-32,768。

对于您的代码,假设char是was 'D'。请注意,'D' == 68由于其代码点是68

return 10 + ch - 'A';

这将返回10 + 68 - 65,因此它将返回13

现在,假设字符是'Q' == 81

if (ch >= 'A' && ch <= 'F')

由于'Q' > 'F'81 > 70),这是错误的,因此它将进入代码else块并执行:

return ch - '0';

这将返回,81 - 48因此它将返回33

您的函数返回一个int类型,但是如果要返回一个类型char或将其int强制转换为char之后的类型,则33返回的值将表示该'!'字符,因为33它是其代码点值。在ASCII表或Unicode表中查找字符以进行验证'!' == 33(比较十进制值)。



 类似资料:
  • targetPixValList是一个包含Double对象的列表,它也包含列表中连续位置的相似值,当我尝试使用Code_1比较两个Double值时,cnt返回零。当我使用code_2时,cnt返回值。 列表的类型是 为什么“==”运算符不能与Double一起使用? 代码_1: Code_2:

  • 问题内容: 如果使用一元/ 运算符作为转换函数来执行转换,那么为什么我们需要一元运算符?这些一元运算符有什么特殊需要? 问题答案: 一元运算符将其操作数转换为数字类型。一元运算符将其操作数转换为数字类型,然后取反。(根据ECMAScript规范) 实际上,一元仅用于将负数放在正则表达式中,例如: 那是工作中的一元负运算符。正如规范所暗示的,一元等效于作为函数调用的Number()构造函数。 我只能

  • 问题内容: 这段代码有什么问题: 问题答案: 三元运算符不能有不返回值或方法的语句。您需要具有返回值的语句。 您需要重写它。

  • 问题内容: 我已经使用Java几年了,但是直到最近我还没有遇到过这种构造: 这可能是一个非常简单的问题,但是有人可以解释吗?我该如何阅读?我很确定我知道它是如何工作的。 如果isHere为真,getHereCount()则称为 如果isHere为假,getAwayCount()则调用。 正确?这个结构叫做什么? 问题答案: 是的,它是 它称为条件运算符。许多人(错误地)将其称为三元运算符,因为它是

  • 问题内容: 我最近遇到了以下代码: 这是什么,某种反向双λ? 问题答案: 没有操作员。第一个只是Java 8中引入的lambda语法,第二个是误导性的“小于” 和“一元减”的串联。 您可以将其读取为,即它会测试是否小于,所有(很好,大多数)负数就是这种情况,因此命名为。 仅出于完整性考虑:此测试不仅(有意地?)难以理解,而且-如评论中所指出- 也因(而)失败。相反,您可能应该只使用简单得多的。

  • 问题内容: public int add(int a, int b){ while (b != 0){ int carry = (a & b) ; 这是使用按位运算来计算两个整数之和的代码。 如果我手动/编程计算,我会看到它适用于每个整数。但是我无法弄清楚和之间的中间值之间的任何关系。为什么将进位乘以2分配给? PS:我在Java中找到了一个按位乘法和 加法的答案,但这是乘法而不是加法。 问题答案