一个简单的关于int 和short ,byte 的问题,高手请进

一头浮躁的小牛 2011-12-08 11:30:48
请教大家一个问题,,,
public class IntegerTest {

public static void main(String[] args) {
short short_test;
int int_test;
float float_test;
short_test=100;//为什么这个可以编译通过? 100默认不是int 类型的吗?
//float_test=1.2;
int_test=50;
short_test=int_test;//为什么这个就会报非运行时异常.
System.out.println(short_test);
}
百度上我也搜了 ,都没有从问题的本质出发,我想知道他们底层是怎么实现的. 顺便也分析下byte 谢谢.
...全文
200 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
st_laohu 2011-12-09
  • 打赏
  • 举报
回复
+10086[Quote=引用 1 楼 goldenfish1919 的回复:]
short_test=100;//为什么这个可以编译通过? 100默认不是int 类型的吗?
照你这么说,short类型就没法赋值了?
short s = 1;不是一样的道理?
只要在short的范围以内,就可以直接赋值。

short_test=int_test;//为什么这个就会报非运行时异常.
int_test是一个变量,编译期只知道这是一个int,又不知道这个int到底是多……
[/Quote]
yydada2011 2011-12-09
  • 打赏
  • 举报
回复
呵呵,我们也刚好学到这里的样子,我们老师是这么解释的

byte,short,char取值范围内的字面常量(字面常量懂不?就是数字本身)可以直接赋值,如果超出了他们的取值范围,需要进行强制转换。但是如果是把一个变量赋值给这些类型的变量,则会报丢失精度的错误。
eg:
byte b =127; //ok
byte b = 128;//error code
byte b =(byte)128//ok,结果是-128,因为强制转换丢失了精度


float float_test=1.2
这样子赋值是不可以的,尽管1.2在float所能表示的取值范围内,因为整数和小数的二进制表示不一样
eg:
byte b1=1;
把一赋值给byte型变量,用32位表示的int 1是前面31个0,最后一个为1
用byte来存储的时候,取32位的低8位,即 0000 0001,大小没有改变

为什么小数不行,建议你自己去看看小数的二进制表示咯

有些东西可以当作规律或者语法记下来,没必要追根究底,因为有些东西挖的太深,对我们初学者来说会很吃力呵呵


龙腾冰 2011-12-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 goldenfish1919 的回复:]

short_test=100;//为什么这个可以编译通过? 100默认不是int 类型的吗?
照你这么说,short类型就没法赋值了?
short s = 1;不是一样的道理?
只要在short的范围以内,就可以直接赋值。

short_test=int_test;//为什么这个就会报非运行时异常.
int_test是一个变量,编译期只知道这是一个int,又不知道这个int到底是……
[/Quote]

++1,这种问题是你c功底不够深厚,建议楼主在看看C的基础吧
pan051 2011-12-09
  • 打赏
  • 举报
回复
byte 1个字节,8个bit
short 2个字节,16个bit
float int 4个字节,32个bit。

所以应该是位数少的可以赋值给位数多的,多的不能赋值给位数少的,我是这样理解的,不知道对不对
jc8futao 2011-12-09
  • 打赏
  • 举报
回复
小范围的值像大范围的值赋值不会有错误,会自动转型。但是大范围的值像小范围转变就要手动的类型转换。因为大范围的值缩小范围了可能会遇到截断的问题,必须手动来做。
南老頭 2011-12-09
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 chianfirstli 的回复:]

引用 1 楼 goldenfish1919 的回复:

short_test=100;//为什么这个可以编译通过? 100默认不是int 类型的吗?
照你这么说,short类型就没法赋值了?
short s = 1;不是一样的道理?
只要在short的范围以内,就可以直接赋值。

short_test=int_test;//为什么这个就会报非运行时异常.
int_test是一个变……
[/Quote]
+1008611
yuweng101 2011-12-08
  • 打赏
  • 举报
回复
高手请进!!!!

LZ V5
java_zf 2011-12-08
  • 打赏
  • 举报
回复
哈哈 LS正解
小小X 2011-12-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 goldenfish1919 的回复:]

short_test=100;//为什么这个可以编译通过? 100默认不是int 类型的吗?
照你这么说,short类型就没法赋值了?
short s = 1;不是一样的道理?
只要在short的范围以内,就可以直接赋值。

short_test=int_test;//为什么这个就会报非运行时异常.
int_test是一个变量,编译期只知道这是一个int,又不知道这个int到底是……
[/Quote]
++
xiaoqiuwyh 2011-12-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 goldenfish1919 的回复:]

short_test=100;//为什么这个可以编译通过? 100默认不是int 类型的吗?
照你这么说,short类型就没法赋值了?
short s = 1;不是一样的道理?
只要在short的范围以内,就可以直接赋值。

short_test=int_test;//为什么这个就会报非运行时异常.
int_test是一个变量,编译期只知道这是一个int,又不知道这个int到底是……
[/Quote]
+1
若鱼1919 2011-12-08
  • 打赏
  • 举报
回复
short_test=100;//为什么这个可以编译通过? 100默认不是int 类型的吗?
照你这么说,short类型就没法赋值了?
short s = 1;不是一样的道理?
只要在short的范围以内,就可以直接赋值。

short_test=int_test;//为什么这个就会报非运行时异常.
int_test是一个变量,编译期只知道这是一个int,又不知道这个int到底是多大,那么,到底short到底能不能容下这个int呢?编译器崩溃了!编译期不是神啊!
quanmu 2011-12-08
  • 打赏
  • 举报
回复
[Quote=引用楼主 ricky_ls 的回复:]
请教大家一个问题,,,
public class IntegerTest {

public static void main(String[] args) {
short short_test;
int int_test;
float float_test;
short_test=100;//为什么这个可以编译通过? 100默认不是int 类型的吗?
//float_test=……
[/Quote]
+1
yiliang1990 2011-12-08
  • 打赏
  • 举报
回复
顶一个 就是 这样的啊
sunyitao2012 2011-12-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 goldenfish1919 的回复:]

short_test=100;//为什么这个可以编译通过? 100默认不是int 类型的吗?
照你这么说,short类型就没法赋值了?
short s = 1;不是一样的道理?
只要在short的范围以内,就可以直接赋值。

short_test=int_test;//为什么这个就会报非运行时异常.
int_test是一个变量,编译期只知道这是一个int,又不知道这个int到底是……
[/Quote]

正解
若鱼1919 2011-12-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 ricky_ls 的回复:]
那你告诉我, 在java 里可以这样 赋值吗? float float_test=1.2 这样可以吗? 1.2在float 范围里.
[/Quote]

你这就是抬杠了,java语法就规定了,float必须带上f,short可没有这么规定。
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 goldenfish1919 的回复:]

short_test=100;//为什么这个可以编译通过? 100默认不是int 类型的吗?
照你这么说,short类型就没法赋值了?
short s = 1;不是一样的道理?
只要在short的范围以内,就可以直接赋值。

short_test=int_test;//为什么这个就会报非运行时异常.
int_test是一个变量,编译期只知道这是一个int,又不知道这个int到底是……
[/Quote]
那你告诉我, 在java 里可以这样 赋值吗? float float_test=1.2 这样可以吗? 1.2在float 范围里.
cplusplus_boy 2011-12-08
  • 打赏
  • 举报
回复
引用 1 楼 goldenfish1919 的回复:

short_test=100;//为什么这个可以编译通过? 100默认不是int 类型的吗?
照你这么说,short类型就没法赋值了?
short s = 1;不是一样的道理?
只要在short的范围以内,就可以直接赋值。

short_test=int_test;//为什么这个就会报非运行时异常.
int_test是一个变量,编译期只知道这是一个int,又不知道这个int到底是……


++++
内容概要:本文围绕“新型电力系统下多分布式电源接入配电网承载力评估方法”的研究,系统性地介绍了基于Matlab的仿真建模与代码实现方案,旨在评估高比例分布式电源(如光伏、风电等)接入背景下配电网的接纳能力。研究融合了智能优化算法(如蜣螂优化、灰狼优化、遗传算法)、多目标优化、鲁棒优化及双层优化模型,结合潮流计算、稳定性分析与故障仿真,构建了完整的承载力评估体系。文档不仅提供核心算法实现,还拓展至微电网调度、储能配置、电氢耦合系统、电动汽车协同等前沿方向,强调“复现+创新”相结合的科研路径,助力研究者快速掌握高水平论文复现技巧并激发原创思路。; 适合人群:具备电力系统、自动化或相关专业背景,熟悉Matlab/Simulink仿真环境,正在从事科研或工程应用的研究生及初级科研人员(工作1-3年);; 使用场景及目标:①复现高水平期刊中关于配电网承载力的优化模型;②开展高比例可再生能源接入下的配电网规划与运行研究;③学习并应用智能优化算法解决复杂电力系统问题;④获取完整科研资源包以加速课题进展与论文撰写; 阅读建议:建议读者关注公众号“荔枝科研社”获取网盘资源,下载全套代码与模型文件,按照文档结构循序渐进学习,重点理解算法设计逻辑与仿真建模细节,结合所提供的复现案例深化对优化模型与工程应用场景的理解,提升科研效率与创新能力。

62,622

社区成员

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

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