求助FLOAT与LONG型的强制类型转换 float n的问题

java(38)
本文为你介绍Java中类型转换和强制类型转换的实现过程。
你已经知道把一种类型的值赋给另外类型的一个变量是相当常见的。如果这2种类型是兼容的,那么Java 将自动地进行转换。例如,把int 类型的值赋给long 类型的变量,总是可行的。然而,不是所有的类型都是兼容的,因此,不是所有的类型转换都是可以隐式实现的。例如,没有将double 型转换为byte 型的定义。幸好,获得不兼容的类型之间的转换仍然是可能的。要达到这个目的,你必须使用一个强制类型转换,它能完成两个不兼容的类型之间的显式变换。让我们看看自动类型转换和强制类型转换。
Java 的自动转换
如果下列2个条件都能满足,那么将一种类型的数据赋给另外一种类型变量时,将执行自动类型转换(automatic type conversion):
这2种类型是兼容的。
目的类型数的范围比来源类型的大。
当以上2个条件都满足时,拓宽转换(widening conversion )发生。例如,int 型的范围比所有byte 型的合法范围大,因此不要求显式强制类型转换语句。
对于拓宽转换,数字类型,包括整数(integer )和浮点(floating-point )类型都是彼此兼容的,但是,数字类型和字符类型(char)或布尔类型(bollean )是不兼容的。字符类型(char )和布尔类型(bollean )也是互相不兼容的。
不兼容类型的强制转换
尽管自动类型转换是很有帮助的,但并不能满足所有的编程需要。例如,如果你需要将int 型的值赋给一个byte 型的变量,你将怎么办?这种转换不会自动进行,因为byte 型的变化范围比int 型的要小。这种转换有时称为“缩小转换”(),因为你肯定要将源数据类型的值变小才能适合目标数据类型。
为了完成两种不兼容类型之间的转换,你就必须进行强制类型转换。所谓强制类型转换只不过是一种显式的类型变换。它的通用格式如下:
(target-type)value
其中,目标类型(target-type )指定了要将指定值转换成的类型。例如,下面的程序段将int 型强制转换成byte 型。如果整数的值超出了byte 型的取值范围,它的值将会因为对byte 型值域取模(整数除以byte 得到的余数)而减少。
b = (byte)
当把浮点值赋给整数类型时一种不同的类型转换发生了:截断(truncation )。你知道整数没有小数部分。这样,当把浮点值赋给整数类型时,它的小数部分会被舍去。例如,如果将&#赋给一个整数,其结果值只是1,0.23 被丢弃了。当然,如果浮点值太大而不能适合目标整数类型,那么它的值将会因为对目标类型值域取模而减少。
下面的程序说明了强制类型转换:
// Demonstrate casts.
class Conversion {
public static void main(String args[]) {
int i = 257;
double d = 323.142;
System.out.println(&
Conversion of int to byte.&);
b = (byte)
System.out.println(&i and b & + i + & & + b);
System.out.println(&
Conversion of double to int.&);
System.out.println(&d and i & + d + & & + i);
System.out.println(&
Conversion of double to byte.&);
b = (byte)
System.out.println(&d and b & + d + & & + b);
该程序的输出如下:
Conversion of int to byte.
i and b 257 1
Conversion of double to int.
d and i 323.142 323
Conversion of double to byte.
d and b 323.142 67
让我们看看每一个类型转换。当&#被强制转换为byte 变量时,其结果是257除以256 (256是byte 类型的变化范围)的余数1。当把变量d转换为int 型,它的小数部分被舍弃了。当把变量d转换为byte 型,它的小数部分被舍弃了,而且它的值减少为256 的模,即67。
基本数据类型
在JAVA中一共有八种基本数据类型,他们分别是
byte、short、int、long、float、double、char、boolean
其中byte、short、int、long都是表示整数的,只不过他们的取值范围不一样
byte的取值范围为-128~127,占用1个字节(-2的7次方到2的7次方-1):具体请看补码
short的取值范围为-,占用2个字节(-2的15次方到2的15次方-1)
int的取值范围为(-~),占用4个字节(-2的31次方到2的31次方-1)
long的取值范围为(-4807),占用8个字节(-2的63次方到2的63次方-1)
可以看到byte和short的取值范围比较小,而long的取值范围太大,占用的空间多,基本上int可以满足我们的日常的计算了,而且int也是使用的最多的整型类型了。
在通常情况下,如果JAVA中出现了一个整数数字比如35,那么这个数字就是int型的,如果我们希望它是byte型的,可以在数据后加上大写的B:35B,表示它是byte型的,同样的35S表示short型,35L表示long型的,表示 int我们可以什么都不用加,但是如果要表示long型的,就一定要在数据后面加“L”。
如果一个整数表达式包含byte、short、int已经字面量数字,在进行计算以前,所有表达式的类型被提升到整形
在给长整形变量赋以超出int类型数值范围(-~)以外的数时,必须在之后加大写或者小写的L
float和double是表示浮点型的数据类型,他们之间的区别在于他们的精确度不同
float 3.402823e+38 ~ 1.(e+38表示是乘以10的38次方,同样,e-45表示乘以10的负45次方)占用4个字节
double 1.797693e+308~ 4.4 占用8个字节
double型比float型存储范围更大,精度更高,所以通常的浮点型的数据在不声明的情况下都是double型的,如果要表示一个数据是float型的(给单精度的变量赋以带小数的初值时必须在数值后面加F或f),可以在数据后面加上“F”。
浮点型的数据是不能完全精确的,所以有的时候在计算的时候可能会在小数点最后几位出现浮动,这是正常的。
boolean型(布尔型)
这个类型只有两个值,true和false(真和非真)
boolean t = true;
boolean f = false;
char型(文本型)
用于存放字符的数据类型,占用2个字节,采用unicode编码,它的前128字节编码与ASCII兼容
字符的存储范围在/u0000~/uFFFF,在定义字符型的数据时候要注意加' ',比如 '1'表示字符'1'而不是数值1,
char c = ' 1 ';
我们试着输出c看看,System.out.println(c);结果就是1,而如果我们这样输出呢System.out.println(c+0);
结果却变成了49。
如果我们这样定义c看看
char c = ' /u0031 ';输出的结果仍然是1,这是因为字符'1'对应着unicode编码就是/u0031
char c1 = 'h',c2 = 'e',c3='l',c4='l',c5 = 'o';
System.out.print(c1);System.out.print(c2);System.out.print(c3);System.out.print(c4);Sytem.out.print(c5);
在前面我们看到过这样的定义:
String s = &hello&;
System.out.println(s);跟上面的5条语句组合起来的效果是一样的,那么String是个什么呢?String是字符串,它不是基本数据类型,它是一个类。
基本数据类型的转换
数字类型包括整数和浮点类型,它们都是兼容的。
以下是一个实例
public class TestConvert2 {
&public static void main(String[] args) {
&&& int i=1,j=12;
&&& float f1=(float)0.1;& //0.1f
&&& float f2=123;
&&& long l1 = =L;
&&& double d1 = 2e20,d2=124;
&&& byte b1 = 1,b2 = 2,b3 = 127;
&&& j = j+10;
&&& i = i/10;
&&& i = (int)(i*0.1);
&&& char c1='a',c2=125;
&&& byte b = (byte)(b1-b2);
&&& char c = (char)(c1+c2-1);
&&& float f3 = f1+f2;
&&& float f4 = (float)(f1+f2*0.1);
&&& double d = d1*i+j;
&&& float f = (float)(d1*5+d2);
阿里巴巴考试里的一道经典的题目:
经过强制类型转换之后,变量a,b的值分别为():short a=128;byte b=(byte) a
B 128 -128
D 编译错误
应该选B,因为 short a=128是可以的(字面量数字在进行计算以前,所有表达式的类型被提升到整形,这里只是简单的赋值语句)
(byte) a,),(是128,原码和补码都是如此),截断之后是,这个就是-128
(-128)没有相对应的原码和反码,(-128) = ()。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:342822次
积分:4932
积分:4932
排名:第4259名
原创:55篇
转载:650篇
评论:19条
(9)(4)(8)(22)(8)(4)(17)(49)(57)(13)(11)(4)(1)(4)(16)(4)(1)(1)(7)(1)(4)(17)(3)(6)(11)(32)(8)(7)(12)(13)(24)(74)(162)(44)(51)Java动类型转换与强制类型转换_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
Java动类型转换与强制类型转换
上传于||文档简介
&&J​a​v​a​动​类​型​转​换​与​强​制​类​型​转​换
阅读已结束,如果下载本文需要使用0下载券
想免费下载更多文档?
定制HR最喜欢的简历
你可能喜欢小端模式与强制数据类型转换 - 开源中国社区
当前访客身份:游客 [
当前位置:
小端模式与强制数据类型转换
1.先从一个问题说开去
C++数据类型转换的问题
#include &iostream.h&
void main()
int i=0xb62;
这里为什么输出的是b?
2.先检测一下我们所使用的电脑的CPU的字节序
版本一(有问题,结果无论如何都是34,不能说明34是高地址的还是低地址的)
版本二(根据&的留言修改后得到的,在此谢谢&的建议)
从上图可知,CPU的字节序是小端模式。
小端模式(Little-Endian)&
& & & &数据类型中的高位数据存放于高地址部分,低位数据存放于低地址部分。简而言之:高位在后,低位在前。 大端模式(Big-Endian)& & & & &数据类型中的高位数据存放于低地址部分,低位数据存放于高地址部分。简而言之:高位在前,低位在后。
3.初步分析
& & & & 0xb62是十六进制,因为char是一个字节的,所以我们只取低8位(丢弃了高字节,而保留了低字节),这是和语言有关,和CPU的架构无关,一个十六进制位转换为4个二进制位,所以,低8位就是62转换的,就是,传递给char后,char的值就是98,根据ASCII,就会输出b。
4.强制数据类型转化
& & 强制类型转换是通过类型转换运算来实现的。其一般形式为:(类型说明符)(表达式)其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。自动转换是在源类型和目标类型兼容以及目标类型广于源类型时发生一个类型到另一类的转换。
& & & & 当操作数的类型不同,而且不属于基本数据类型时,经常需要强制类型转换,将操作数转化为所需要的类型。强制类型转换具有两种形式,称为显式强制转换和隐式强制类型转换。
4.1.显式强制类型转换
& & & & &显式强制类型转换需要使用强制类型转换运算符,格式如下: & type(&expression&) & 或 (type)&expression& 其中,type为类型描述符,如int,float等。&expression&为表达式。经强制类型转换运算符运算后,返回一个具有type类型的数值,这种强制类型转换操作并不改变操作数本身,运算后操作数本身未改变,例如:
int nVar=0xab65;
char cChar=char (nVar);上述强制类型转换的结果是将整型值0xab65的高端两个字节删掉,将低端两个字节的内容作为char型数值赋值给变量cChar,而经过类型转换后nVar的值并未改变。
4.2.隐式强制类型转换
& & & & 隐式类型转换发生在赋值表达式和有返回值的函数调用表达式中。在赋值表达式中,如果赋值符左右两侧的操作数类型不同,则将赋值符右边操作数强制转换为赋值符左侧的类型数值后,赋值给赋值符左侧的变量。在函数调用时,如果return后面表达式的类型与函数返回值类型不同,则在返回值时将return后面表达式的数值强制转换为函数返回值类型后,再将值返回,如:
int nVar;
double dVar=3.88;
nVar=dVar;//执行本句后,nVar的值为3,而dVar的值仍是3.88
4.3.在使用强制转换时应注意以下问题:
1.类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。
2.无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。
& & & &3.如果一个运算符两边的运算数类型不同,先要将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算,转换规则如下图所示。
double ←── float 高
int ←── char,short 低
图中横向箭头表示必须的转换,如两个float型数参加运算,虽然它们类型相同,但仍要先转成double型再进行运算,结果亦为double型。 纵向箭头表示当运算符两边的运算数为不同类型时的转换,如一个long 型数据与一个int型数据一起运算,需要先将int型数据转换为long型, 然后两者再进行运算,结果为long型。所有这些转换都是由系统自动进行的, 使用时你只需从中了解结果的类型即可。这些转换可以说是自动的,但然,C语言也提供了以显式的形式强制转换类型的机制。
4.当较低类型的数据转换为较高类型时,一般只是形式上有所改变, 而不影响数据的实质内容, 而较高类型的数据转换为较低类型时则可能有些数据丢失。
5.当赋值运算符两边的运算对象类型不同时,将要发生类型转换, 转换的规则是:把赋值运算符右侧表达式的类型转换为左侧变量的类型。 C语言赋值时的类型转换形式可能会使人感到不精密和不严格,因为不管表达式的值怎样,系统都自动将其转为赋值运算符左部变量的类型。而转变后数据可能有所不同,在不加注意时就可能带来错误。 这确实是个缺点,也遭到许多人们批评。但不应忘记的是:c面言最初是为了替代汇编语言而设计的,所以类型变换比较随意。当然, 用强制类型转换是一个好习惯,这样,至少从程序上可以看出想干什么。
5.int -----&char类型转化时的内存操作
& & & & 当我们把一个int型强制转化为byte时,由于byte只有1个字节,而int型是4个字节,这样就会产生截断,int把它最低的内存空间里的值放到了byte所对应的内存空间里。如图所示: & &char & & & & & & & & & & & & & int ********** & & & & & & & & &********** * 1 Byte * &-----------* 1 Byte * 低位 ********** & & & & & & & & &********** | & & & & & & & & & & & & & & & & &* 1 Byte * & 高位 & & & & & & & & & & & & & & & & &********** |
6.深入分析开始的问题
& & & & 内存地址是由上到下有从左至右依次递增的,小端字节序指低字节位数据存放在内存低地址处, 高字节位数据存放在内存高地址处; 大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。x86的CPU体系结构中,就是使用小端字节序,即低字节数据存放在低地址处,高字节数据存放在高地址处。将int型的数据转化成char型的数据时,我们只取低8位;如果我们的CPU是小端模式,则我们在进行强制类型转换时不需要调整字节内容,非常的方便;如果我们的CPU是大端模式,则我们,需要将高字节地址的数据存入低字节地址,也就是需要调整字节内容。
小端模式 :强制转换数据不需要调整字节内容,因为1、2、4字节的存储方式的字节的位置是一样。
原文链接:
共有0个评论
更多开发者职位上
有什么技术问题吗?
长平狐的其它问题
类似的话题强制转换_百度百科
本词条缺少名片图,补充相关内容使词条更完整,还能快速升级,赶紧来吧!
定义:指的发行人通过行使而强制投资者将证券转换成为预定数目的证券。
强制转换 Forced Conversion
强制转换信息技术——编程
定义:在、、、等中,将某一变量的类型强制转化成另一类型。
float a=10; // 定义 a为 float 型。
int b=(int)a;// 定义b 为 int 型。然后把 float型的 a 强制转换成 int型。再把a的值 赋值给
强制转换是指java中的向下转型,因为向下转型的时候会丢失精度。向上转型不需要强制,如:
int a= 10;//定义a为int型。
float b = //定义b为float型。然后把a的值赋给b。这种就是向上转型
int b=10;//声明变量为int型并初始化赋值
(&%f&,b*5.0);//打印为的数字,强制将10*5.0结果为50.000000
float a=2.1314;//声明变量为实数型并初始化赋值
int c=(int)//声明变量c为int型并将a强制转换为int型所得值赋给c,即c=2
printf(&%d %f&,c,a);//输出结果为2 2.131400
企业信用信息}

我要回帖

更多关于 php强制转换float 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信