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

将整型文字赋给字节变量时是否需要强制转换?

陆翔飞
2023-03-14

我读了一本书,里面有一句话:

byte rounds = 12, fighters = (byte) 2;

它说

字节原语有一个四字节有符号整数作为其有效文本。如果未执行显式转换,则整数将隐式转换为一个字节。

根据甲骨文文档,一个字节本质上不应该是一个字节吗?

共有3个答案

公孙棋
2023-03-14

字节是一个字节。但是字面意义上的12是整数类型的,也就是4个字节。这句话说的是,当您编写byte回合=12时,存在一个隐式强制转换来将整数12转换成字节。

盖和洽
2023-03-14

如果不执行显式转换,则将整数隐式转换为一个字节。

如果一本书这么说,那是不正确的。或者至少,它没有讲述整个故事。

(从技术上讲,这些是转换而不是强制转换。强制转换涉及Java(

隐式缩小转换的整个过程如下:

  • 它们只适用于作业环境;见JLS 5.2
  • 它们仅在被转换的值是(编译时)常量表达式时适用;见JLS 15.28
  • 它们仅在值类型为bytecharshortint
  • 时适用
  • 它们仅在目标类型为bytecharshort或相应的包装类型(byteCharactershort)时适用
  • 仅当值“适合”目标类型而不截断时,它们才适用

例如:

   byte b = -1;      // OK
   Byte b1 = -1;     // OK
   byte b2 = 255     // Error: value is not in range of 'byte'
   byte b3 = 1 + 1;  // OK
   byte b4 = b + 1;  // Error: not a constant expression

   public void test (byte b) {...}

   test(byte(12));   // OK: explicit narrowing conversion
   test(12);         // Error: not an assignment context.

总之,只有当编译器能够确定它永远不会导致任何信息丢失时,才允许这种转换。

谷梁玺
2023-03-14

例如,Java为初始化基本数据类型提供了特殊的文本

int a = 1234;
double b = 12.34;
float c = 56.78f;
char d = 'x';

留档表示byte类型没有特殊的文字。相反,基元类型byteint共享其文字。当有符号的32位int文字"适合"到单个字节时,Java将执行隐式转换;否则,它将产生编译时错误。

 类似资料:
  • 强制类型转换:将一个数据类型强制转换为其他的数据类型。 类型转换主要指,将其他的数据类型,转换为:String、Number、Boolean。你会把某个数据类型转换成 null 或者 undefined 吗?不会,因为这样做,没有意义。 其他的简单类型 --> String 方法一:变量 + "" 或者 变量 + "abc" 举例如下: var a = 123; // Number 类型 co

  • 问题内容: 如果我执行以下操作 因为0是使用32位的整数文字,而d是使用64位的双精度变量,那么剩余的32位会被随机垃圾填充,还是Java正确地提升了文字? 问题答案: Java正确地将其提升,否则会有相当多的代码是有问题的:-) Java语言规范的5.1.2节详细介绍了这一点: 以下19个特定于原始类型的特定转换称为扩展原始转换: 扩展原始转换不会丢失有关数值总体大小的信息。确实,从整数类型到另

  • 问题内容: 字符串是不可变的,这是否意味着我总是必须通过将字符串传递给方法来做类似的事情? 或者是 精细?我尝试了第二个,它没有给我任何错误,为什么? 问题答案: 字符串是不可变的 是的,您自己承认。不可变 对象 是不允许其状态更改的对象。这包括对象。 然后: 创建一个 新 的小写字母字符串, 并且不使用result 。在这种情况下,这很可能是一个“错误”,因为它仍然评估原始字符串对象(由于它是不

  • 问题内容: 我有一个代码段: 为什么不自动类型转换为while ? 问题答案: 因为是,并且具有更大的范围。因此,将其分配给可能会导致数据丢失。 是一个常数,而编译时间保证在的范围内。

  • 我需要以十六进制表示形式将字符串转换为字节数组。例如: 值:06000002我需要的是: 如何做到这一点?