Java中的递增字符类型

Posted

技术标签:

【中文标题】Java中的递增字符类型【英文标题】:Incrementing Char Type In Java 【发布时间】:2013-06-12 01:51:07 【问题描述】:

在练习 Java 时,我随机想到了这个:

class test

    public static void main(String arg[])
    
        char x='A';
        x=x+1;
        System.out.println(x);
    

我以为它会抛出一个错误,因为我们不能将数值1添加到数学中的字母A,但是下面的程序运行正确并打印了

B 

这怎么可能?

【问题讨论】:

x'B' 的字符和 Unicode 值 = 'A' 的 Unicode 值 + 1 您将 int 添加到 char 的 ASCII 码中,而不是添加到 char 本身。 我希望我们可以在 Java 的上下文中摆脱 ASCII 一词。 Java 自 1995 年问世以来一直在使用 Unicode。 #Grumpymorning。 试试这个x *= 1.1;,它也可以编译。 ;) 引用的程序无法编译。它有两个错误,缺少一个“;”,并且需要将增量的结果转换回 char。 【参考方案1】:

因为 char 类型有效地像 16 位 unsigned int 一样工作。

所以设置char x='A'几乎等同于int x=65加一个;你得到66;或 ASCII 'B'。

【讨论】:

什么?!?不是一个字节。请检查 Java 定义。 它确实像 16 位 int 一样工作。 char 未签名,short 未签名。 感谢您对改进答案的意见。 @fge +1。任何有兴趣的人:docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.2.1【参考方案2】:

char数字类型(2字节长),也是Java中唯一的无符号数字原始类型。

你也可以这样做:

int foo = 'A';

这里的特别之处在于您使用字符常量而不是数字来初始化char。正如您所见,它的特别之处在于它的字符串表示。您可以使用Character.digit(c, 10) 获取其数值(作为int,因为short 无法表示2 ^ 16 - 1!)。

【讨论】:

【参考方案3】:

在 Java 中,char 是数字类型。当您将1 添加到char 时,您将获得下一个unicode code point。如果是'A',下一个代码点是'B'

char x='A';
x+=1;
System.out.println(x);

请注意,您不能使用x=x+1,因为它会导致隐式缩小转换。您需要改用x++x+=1

【讨论】:

感谢您提及隐式缩小转换。【参考方案4】:

每个char 都有一个字符代码。计算机将字符视为无符号数,因此您可以递增它。

【讨论】:

【参考方案5】:

Java 中的char 只是一个整数,因此可以递增/递减它。每个字符数都有一个对应的值,将其解释为一个字符,借助转换表:ASCII 编码,或 UTF-8 编码等。

想一想,计算机中的每一个数据——图像、音乐、程序等都只是数字。一个简单的字符也不例外,它也被编码编码为数字。

【讨论】:

【参考方案6】:

char 在 Java 中存储为 2 字节的 unicode 值。所以如果char x = 'A',则表示A是以unicode格式存储的。在 unicode 格式中,每个字符都表示为一个整数。所以当你说x= x+1时,它实际上增加了A的unicode值,它打印B

【讨论】:

【参考方案7】:

这是你的程序的等效程序:

public class Tester 
    public static void main(String args[])
             char start='\u0041';
             char next='\u0041'+1;
             System.out.println(next);
    

但如您所见,next=start+1 不起作用。这就是java处理的方式。

原因可能是我们可能不小心使用了start,整数1 认为startint 变量并使用该表达式。因为,java 对于最小化逻辑错误非常严格。他们是按照我的想法设计的。

但是,当你这样做时,char next='\u0041'+1; 很明显'\u0041' 是一个字符,1 将被隐式转换为 2 个字节。这是程序员不会犯的错误。可能这就是他们允许这样做的原因。

char 在 java 中是 2 个字节。 char 支持 unicode 字符。当您添加或减去带有偏移整数的 char var 时,将产生 unicode 表中等效的 unicode 字符。因为BA 旁边,所以你得到了B

【讨论】:

【参考方案8】:

char 实际上映射到int,看看Ascii Table。

例如:一个大写的A对应十进制数65。当你在那个char上加1时,你基本上是把十进制数加1。所以数字变成了66,对应的是大写的B。

【讨论】:

感谢链接,现在我明白 java 将 char 视为数字【参考方案9】:

您必须在使用括号添加后键入转换结果,如下所示:

x='A';
x = (char) (x+1);

否则您将摆脱数据错误。

【讨论】:

【参考方案10】:

如果您希望它只是 a-z。

private char getNextChar(char c) 
    return (char)((c + 1 - 'a') % ('z' - 'a' + 1) + 'a');

这样可以避免溢出。

【讨论】:

以上是关于Java中的递增字符类型的主要内容,如果未能解决你的问题,请参考以下文章

Redis数据类型(字符串)

Redis键值数据类型之字符串

Python基础:数据类型-字符串

java中的字符串数据类型

java大神 字符串的转换基本数据类型

java中在arraylist表中的字符串类型数值怎么取