类型运算细节

public static void main(String[] args)

{

byte b = 4;

b = 3+7 ;   这个代码在编译时不会报错

byte a = 4;

byte c = 5;

b =a+c;     这个代码在编译时会报错

System.out.println(b);

}

原因分析 :

在程序中只要见到整数默认都是int类型的

byte   b=4;   4是int类型  编译器在运行的时候判断4这个字节是不是在byte的范围内

如果在范围内,就把4做了一次默认的强转  ,把最后把4的有效字节赋值到了b这个变量当中

所以底层会做这个自动转换过程  ,编译器会做检查并做自动转换

byte  b :-128~127

4只需要用一个字节来表示,其他都为0 判断在byte的范围之内

就把4的值赋给b

b1和b2都是变量  数值会发生变化,值不确定(b1,b2具体的值不确定,不清楚) 编译器不能做出检查,检查不了

 

eg :

byte b  = 3+7 ;

右边是常量,值不会发生变化,编译器可以进行判断是否在byte 范围内

byte b =5;

byte c =1;

byte a = 1‘

a = b+c ;      右边不确定,是无法进行判断 ,所有编译会报错

总结就是:判断数据类型能不不能装的下

short s=3;

// 先检查,判断在范围,再做转换

s+=4;

//   1次运算    编译正常      先赋值2边的和,在进行判断,再进行自动转换

//s=(short)(s+4) 在底层做了强制类型转换   是赋值运算的特点

//  在  底层赋值过程当中,做了强制转换动作

s=s+4    //   2次运算      损失精度  无法判断    所以不进行自动转换动作,

// 进行了自动类型的提升,类型已经不能再赋给低值(低空间)类型,因为会发生精度丢失

时间: 2024-12-09 15:24:29

类型运算细节的相关文章

JAVA-初步认识-第二章-类型运算细节

一. 深入探究变量在不同过程中背后隐藏的原理 变量在程序中参与了两种过程,定义和计算.我们举一些例子,来说明背后的原理.(除了数值型的变量外,其它类型的也可以是变量,只要一直在变动的就是变量.) 在变量的定义过程中,byte b=4; 书写出来的4默认的是int类型,将其赋值给byte类型,在DOS中,应该报错为精度缺失.但是DOS并没有报错,反而运行的很正常.原理就是:在赋值的过程中,计算机会进行判断,赋的值是否在所规定的类型范围之内.在这里4是在-128~127的范围里的,只要在这里范围里,

java中变量运算细节 (2)

/* 目的:测试变量的运算方式 结果:byte a, b, c; a = b+c; 或者 a = b+10 形如这种形式的算式, 等式的右边的运算结果默认的都是int型的!因为等式右边有变量, 编译器无法确定变量的内容 ,因为它是变量!所以相加之后得到的int再默认强制转换成byte可能会损失精度. 而形如 a=4+5:这种常量的赋值,虽然 4 和 5 都默认的是int, 但都是常量,它们的值是确定的!所以如果 4+5的值超过了 byte的最大值的范围, 那就会编译出错!(也就是等式右边都是常量

Double 类型运算时的精度问题

double 类型运算时的 计算的精度不高,经常会出现0.999999999999999这样的情况,那么就需要用BigDecimal   它是java提供的用来高精度计算的工具类 下面是对这个类的一个包装,方便使用: package cn.soft.util; import java.io.Serializable; import java.math.BigDecimal; import org.springframework.stereotype.Component; /** *类描述: do

有符号和无符号类型运算

#include <iostream> int main() { unsigned i = 10 , j = 30 ; int m = -42 , n = 30 ; std::cout<<i-j<<std::endl; std::cout<<m*i<<std::endl; std::cout<<unsigned(-420)<<std::endl; return 0 ; } 结论:有符号和无符号类型相运算(加减乘除),先运算

decimal类型运算注意点

代码如下: 1 //货币类型的两个数基本运算 2 Console.WriteLine("错误的写法"); 3 decimal errorNumA = (10 - 6); 4 decimal errorNumb = errorNumA / 10; 5 decimal errorNumC = (10 - 6) / 10; 6 7 Console.WriteLine(errorNumb); 8 Console.WriteLine(errorNumC); 9 10 11 Console.Wri

Java中的Bigdecimal类型运算

双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更小的数进行运算和处理.Java在java.math包中提 供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.表5.7中列出了BigDecimal类的主要构造器和方法. 构造器  描 述 BigDecimal(int)创建一个具有参数所指定整数值的对象. BigDecimal(double)创建一个具有参数所指定双精度值的对象. BigDecimal(long)创建一个具有参数所指定长整数值的

Python入门之数字类型运算

Python数字类型有整数类型了.浮点数类型和复数类型.分别对应整数.实数和复数. 整数:    除十进制以外,其他进制需要前加引导符号如:二进制(bit)0b101 或 0B101:八进制(octonary)0o711 或 0O711:十六进制(hexadecimal) 0xABC  或 0XABC 本节课此部分还介绍了pow()函数. 浮点数:所有浮点数必须带有小数部分,浮点数有十进制表示和科学计数法表示.科学计数法形式<a>e<b> = a*10b 如4.3e-3 = 0.0

PHP学习笔记四【类型运算】

<?php //类型运算符 class Dog { } class Cat { } $a=new Cat; var_dump($a instanceof Cat); //在实际开发中,判断某一个变量是否是某个类型 if($a instanceof Cat) { echo '<br/>$a 是一只猫'; } $b=123; if($b instanceof integet)//[无法判断]只能用来判断class类型不能用来判断基本数据类型 { echo '$b 是一个整数'; } //br

对于final修饰的类型运算时的表现

我们知道,对于byte,char,这些数据类型加减时都会转化成int在运算,然而,对于final修饰过的数据是不会发生转换的. 比如说 byte b1=1; byte b2=2; byte b3=b1+b2;对于这句话是有问题的,因为右边算出来是个int,而大转小必须强转,所以会出错. 但是现在我们用final修饰b1,b2 final byte b1=1; final byte b2=2; byte b3=b1+b2:这句话是没有问题的. 原文地址:https://www.cnblogs.co