关于java中类型转化运算 为什int型128转换成 byte型就成了-128了呢?
6个回答
展开全部
这个涉及补码的知识。我先给你写出结论:正数的补码是本身的二进制表示,负数的补码=对应正数的二进制反码+1(反码即二进制的所以位取反),并规定首位为符号位不表示值,0为正1为负。
说了这么一堆,有啥用呢?有!整数在计算机中就是以补码的形式存储的。
OK基础有了我们来看看这个问题。int 类型的128,没有问题,int存储边界远比比128大。而转化成byte类型,问题就来了。我们先来看int类型的128的二进制表示:0000-0000-0000-0000-0000-0000-1000-0000也就是它的补码
转化成byte类型表示为:
1000-0000
我们会发现这里首位需要表示为值!但是遗憾计算机不会自动识别造型时的期望值。1000-0000在计算机中是一个补码而并非一串正数二进制。我们对它取反得到0111-1111发现正是最大的byte类型值127,再加一得128,而首位为1,表示为负,即1000-0000表示的就是-128就是最小的byte值。
这也就是byte类型值介于-128~127的原因。后面一个方法是一样的,不再赘述。
当然补码的知识不止于此,有兴趣可以在网上寻找有关资料。
说了这么一堆,有啥用呢?有!整数在计算机中就是以补码的形式存储的。
OK基础有了我们来看看这个问题。int 类型的128,没有问题,int存储边界远比比128大。而转化成byte类型,问题就来了。我们先来看int类型的128的二进制表示:0000-0000-0000-0000-0000-0000-1000-0000也就是它的补码
转化成byte类型表示为:
1000-0000
我们会发现这里首位需要表示为值!但是遗憾计算机不会自动识别造型时的期望值。1000-0000在计算机中是一个补码而并非一串正数二进制。我们对它取反得到0111-1111发现正是最大的byte类型值127,再加一得128,而首位为1,表示为负,即1000-0000表示的就是-128就是最小的byte值。
这也就是byte类型值介于-128~127的原因。后面一个方法是一样的,不再赘述。
当然补码的知识不止于此,有兴趣可以在网上寻找有关资料。
追答
另外补充一下负数反码那部分你可能有混淆。就拿原题
1000-0000这个补码,那么如何求它表示的数。我总结成如下:该负数的“绝对值”等于其反码0111-1111表示的数+1
而如何求一个负数的反码,如-1。
其对应正数补码为0000-0001
取反为1111-1110,再加一为1111-1111
反过来证明一下:1111-1111
取反0000-0000为0
加一为1
即这个负数绝对值为1,则这个负数为-1
展开全部
byte类型的取值范围是-128~127
所以int转换之后回丢掉多余的部分-129变成-128而128变成127
所以int转换之后回丢掉多余的部分-129变成-128而128变成127
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
因为越界了。你可以看一下数据类型的范围就明白了。128这个数已经超过了byte的范围
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
int符号位太高,字节位太少,符号位被128赋值成1是负数
-128到127是一个字节全部的数。
-128到127是一个字节全部的数。
追问
你好 可以讲的详细一点吗?
我有点不懂。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个和编码过程有关
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询