黑马程序员技术交流社区

标题: 一个类型转换的问题 [打印本页]

作者: 梁志仲    时间: 2012-8-25 15:10
标题: 一个类型转换的问题
将long类型的32768转换成short类型,结果居然是-32768。
原理是什么呢?
作者: 冯心程    时间: 2012-8-25 15:16
内存溢出了
整型:byte(1个字节)short(2个字节)int(4个字节)long(8个字节)
short装不下long那么大的
short 最大值才是2的15次幂-1
long的是2的63次幂-1

内存溢出了
作者: 黑马杨晨    时间: 2012-8-25 15:19
32768=(1000 0000 0000 0000)2转换成short,则最高位的1变成符号位,于是是负数,所以是补码表示的,取反+1转换为十进制再加上负号就可以了。0111 1111 1111 1111 + 1 = 1000 0000 0000 0000=(32768)10加上负号就是-32768于是转换为short的结果就是-32768long+int=long
作者: 刘源    时间: 2012-8-25 15:35
long型是8个字节64位
short是2个字节16位。
long=32768 的二进制: 1000    0000   0000  0000 因为最高位还是0,所以是正数。
变成short之后只有16位 :1000 0000 0000 0000 因为最高位是1,所以是负数。-1然后取反.就是:
(-1)是:0111 1111 1111 1111 1111取反 1000 0000 0000 0000,还是32768,
所以其short型是-32768
作者: 唐见    时间: 2012-8-25 15:40
short的取值范围是-32768~32767,32768超出了它的取值范围。告诉你个经验:像这种将超出范围的值强制转换后,它的结果为最小负数加上超出范围的值再减1。如32768转换成short结果就为:-32768+(32768-32767)-1=-32768。如果你是将32769转换成short类型,结果就为-32768+(32769-32767)-1=-32767。
作者: 郗绿阳    时间: 2012-8-25 16:20
内存溢出了 数据在计算机存储时都是用补码的形式存储的 其中最高位表示符号位 long型的是64个字节即1000 0000 0000 0000前还有好多的0 而short是16字节刚好是这个值 最高位的1表示符号 所以就是-32768




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2