Chinaunix首页 | 论坛 | 博客
  • 博客访问: 129502
  • 博文数量: 22
  • 博客积分: 1533
  • 博客等级: 上尉
  • 技术积分: 225
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-30 11:09
文章分类

全部博文(22)

文章存档

2011年(1)

2010年(7)

2008年(14)

我的朋友

分类: Java

2008-10-08 21:59:03

数据类型的转换分两种:自动转换和强制转换。
 
1.自动转换
    自动转换用于短字节的数据类型转换为长字节的数据类型,一般情况下,自动转换都不会改变数据的大小。
eg:byte a;
    int x=a;
   若 a=101 为正数,首先,写出它的补码01100101(整型数据在机器中以补码形式存储),然后在补码的前面补24个0,直到补齐4个字节,然后,再转换成原码(其实此处原码和补码相同)并读数;
   若 a=-101 为负数,写出它的补码10011011,然后在补码的前面补24个1,直到补齐4个字节,然后,再转换成原码10000000 00000000 00000000 01100101(第一位不变)并读数。
 
2.强制转换
   强制转换用于长字节的数据类型转换为短字节的数据类型,而且,不仅可能丢失数据的精度,还可能改变数据的大小以及正负号。
eg:int a;
    byte x=(byte)a;
(int型的数据有4个字节,只有第一位为符号位,而byte型的数据只有一个字节,所以只取最后一个字节。)
   若 a=130 为正数,首先,写出它的补码00000000 00000000 00000000 10000010,r=(10000010)=130,但是byte型的数据取值范围是[-128,127];所以 r-M =-126在范围内,其中M=128+127+1,然后再将-126转换成二进制形式的,既是x;
   若 a=-130 为正数,写出它的原码10000000 00000000 00000000 10000010,再转换成补码11111111 11111111 11111111 01111110,r=(01111110)=126,在范围内,此时 r 既是 x。
小结:长字节的数据类型转换为短字节的数据类型时,取的是靠后的字节。
   
   先将数据写成补码形式的,然后取对应的字节并计算成十进制形式的r(注意:此时把对应的字节看成纯二进制形式的,而不考虑它的符号),再考虑r的范围,若不在其数据类型的范围内,则数据类型范围[-L,R],其模为 M=L+R+1 ,如果r大于R,则模运算就会不断从r中减去M,直至r落在[-L,R]内,如果一个运算结果r
小于-L,则模运算就会不断在r中加上M,直至r落在[-L,R]内。此时 r 既是 x,若再想转换成二进制形式的,此时需考虑符号。
阅读(1878) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~