为什么10可以赋值给byte,short和int而没有编译错误!

weknow619 2014-11-09 09:40:28
float f = 10.0; // error
float f = 10.0f; // ok
10.0的默认类型是double,double赋值给float,当然不行。
再看:
char c = 10; // ok
byte b = 10; // ok
short s = 10; // ok
int i = 10; // ok
10的默认类型是int,int赋值给char,byte,short,为什么就可以呢?
在java中10这个常量到底是怎么存放的呢?和String类型的常量(例如“hello”)是一样的吗?
是数字的整型常量都存为32位整型吗?
...全文
907 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
迷惘人士 2018-07-18
  • 打赏
  • 举报
回复
char c=10;//ok 这是给c初始化一个值
c=c+10;//error char=char+int
c+=10; //ok += 相当于初始化
byte b=10;//ok 这是给b初始化一个值
b=b+10;//error byte=byte+int
b+=10;//ok += 相当于初始化
short s=10;//ok 这是给s初始化一个值
s=s+10;//error shor=shor+int
s+=10;//ok += 相当于初始化
int i=10;//ok 这是给i初始化一个值
i=i+10;//ok int=int+int
i+=10;//ok
vanity_chang 2018-07-06
  • 打赏
  • 举报
回复
后面的数值常量在 -128~127 范围内类型为byte
后面的数值常量在 -2^15 ~ -128 & 127 ~ 2^15 - 1 范围内类型为short
song_suo 2014-11-13
  • 打赏
  • 举报
回复
short a=1; jvm会隐式的进行强转,在强转之前要检查所赋值的范围,要是在范围之内,就不报错。
qq_23256405 2014-11-13
  • 打赏
  • 举报
回复
why a = a+1 error?
多木多多木 2014-11-13
  • 打赏
  • 举报
回复
引用 8 楼 sui2121 的回复:
6楼说的对 好像有个经典的面试题 short a=1; a += 1; a = a+1; 好像是这样的,问那段代码出错
a=a+1出错。
多木多多木 2014-11-13
  • 打赏
  • 举报
回复
byte型数据占一个字节,short型数据占16位,int型数据占32位,10这个数字在内容中不用一个字节就可以存储,所以没有问题。
luwenke 2014-11-10
  • 打赏
  • 举报
回复
一般JVM虚拟机都会做一个预处理。
  • 打赏
  • 举报
回复
默认是Int型,看编译器,会转型。
sui2121 2014-11-10
  • 打赏
  • 举报
回复
6楼说的对 好像有个经典的面试题 short a=1; a += 1; a = a+1; 好像是这样的,问那段代码出错
pserkaige 2014-11-09
  • 打赏
  • 举报
回复
我昨天也在想这个问题,看了很多版本的回答,始终没看到有根有据的,想搞清楚到底是是什么机制
skyWalker_ONLY 2014-11-09
  • 打赏
  • 举报
回复
这其实仅仅是语法规则而已,至于存储是按照变量类型存储的
wyc_ 2014-11-09
  • 打赏
  • 举报
回复
你好,是这样的。Java中整数默认是int是正确的。这里 char c = 10; // ok byte b = 10; // ok short s = 10; // ok int i = 10; // ok 正确的原因倒不是因为整数不整数,是因为10在编译阶段就是确定的,编译器可以对它进行范围检查,所以如果char c = 300就会编译阶段报错。 如果这样: int i = 10; char c = i; 虽然范围也是正确的,但是编译器会报错。
Jayfon 2014-11-09
  • 打赏
  • 举报
回复
4楼正解!byte, short, int, long这些整数默认都是int型,都是以int型计算的,只要不超过他们的取值范围就可以进行赋值。 byte 为1字节 -128~127 short为2字节 -32,768~32,767 int为4字节 -2,147,483,648~2,147,483,647 long 为8字节 -9,223,372,036,854,775,808L~9,223,372,036,854,775,807L 而char为2字节 0~65535
「已注销」 2014-11-09
  • 打赏
  • 举报
回复
因为在Java中规定所有整数默认是int型。但是只要在byte,short它们的取值范围内赋值都是可以的,比如byte=127 就是可以的 但是你给byte=128 就不行了 因为就超出byte 127 的最大范围了。char=数字 并不代表那是一个数字 char赋值整数代表的是它背后的符号 字符 。因为每一个字符给它硬性对应一个整数值,这是美国老规定的,char的整数也是有范围的 应该0到是6万多,这个大概知道就行了。
duoyu1991 2014-11-09
  • 打赏
  • 举报
回复
因为此处的会涉及到一个类型转换的问题,因为数值在存放的时候都是按照字节存放的,所以向下会有精度的损失,你说的10太小了,下面的类型都能存放所以没有精度损失,

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧