当前位置: 首页 > 知识库问答 >
问题:

Java字符到字节转换

吴英武
2023-03-14

我一直在测试char casting,我经历了以下几点:

public class Test {
    public static void main(String a[]) {
        final byte b1 = 1;
        byte b2 = 1;
        char c = 2;

        c = b1; // 1- Working fine
        c = b2; // 2 -Compilation error
    }
}

有人能解释为什么我在1中给字节添加了一个final时它工作得很好吗?

共有3个答案

翁钧
2023-03-14

这是因为字节是有符号类型,而字符不是,所以需要对(2)应用显式类型转换

c = (char)b2;

最后的语句也适用于1,因为在编译之前,编译器能够确认没有由于转换而丢失,因为'1'在char的范围内,尝试将'-1'与(1)中的相同的最后语句放在一起,您将再次得到编译错误。

所有这些都归结为有符号和无符号类型之间的类型兼容性。。这需要在java中显式完成。

赵英资
2023-03-14

字节字符的转换是一种扩大和缩小的原语转换,如Java语言规范第5.1.4段所述。

正如JLS所描述的,这是通过中间步骤完成的;通过拓宽原语转换将byte转换为int,然后通过缩小原语转换将int转换为char(参见5.1.3)。

第5.2段解释了当你做作业时,什么时候需要演员阵容:

... 如果表达式是byteshortcharint类型的常量表达式(§15.28):

  • 如果变量的类型是字节字符,并且常数表达式的值可以用变量的类型表示,则可以使用缩小原语转换

变量b1确实是一个常数,但变量b2不是,因此此规则适用于b1,但不适用于b2

因此:您可以将b1分配给c,因为b1是一个常数,常数1的值适合char,但您不能将b2分配给c,而不进行强制转换,因为b2不是一个常数。

毋修为
2023-03-14

当变量为final时,编译器会自动内联其值1。该值可表示为字符,即:

c = b1;

是相当于

c = 1;

事实上,根据final变量的这一节,b1被视为一个常数:

原始类型或类型String的变量,即最终类型,并用编译时常量表达式初始化(§15.28),称为常量变量。

 类似资料:
  • 我遇到了这样一个java字符串,其中以下内容是错误的: 我想这是因为字符串构造函数默认将主体字节[]的编码视为UTF-8,我不是100%确定。我如何能够将此字符串存储在字节[]中,并能够稍后将其转换回来?我想我需要能够确定字节[]的编码方式。我该怎么做呢? 一些上下文:我需要字节[],以便压缩数据,将其存储在数据库中,然后解压缩并将未压缩的字节[]转换回原始字符串。这个字符串最初来自某个下载了网页

  • 问题内容: 我一直在测试字符转换,并经历了以下过程: 任何人都可以解释为什么当我在字节中添加final后在1中可以正常工作吗? 问题答案: 当变量为时,编译器将自动内联其值为1的值。该值可表示为,即: 相当于 实际上,根据本节中有关变量的部分,将其视为常量: 原始类型或类型的变量,即,用一个编译时间常量表达式(§15.28)初始化,被称为 恒定变量 。

  • 如何将字符串(字节字符串)转换为字节(字节字符串),而不必手动复制和粘贴字符串并在其前面放置b?

  • 问题内容: 我试图理解一个到字符串,一个的字符串表示形式到转换…我将我的转换成一个要发送的字符串,然后我希望我的Web服务(用python编写)将数据直接回显给客户端。 当我从Java应用程序发送数据时… 字节发送.. 发送(这是Arrays.toString()的结果,它应该是我的字节数据的字符串表示形式,该数据将通过电线发送): 在python端,python服务器将字符串返回给调用方(我可以

  • 我正在制作一个Android应用程序,它可以与蓝牙设备进行通信。我正在为选定的特征写一条特定的信息,如下所示: 我的转换函数如下所示: 我试图弄清楚为什么在这种情况下,我的转换输出是这样的: D/上传数据集:消息:�������������������� 这很奇怪,因为当我使用相同的转换函数来转换作为蓝牙通知接收到的值时,它工作得非常好。欢迎提出问题所在的任何建议