http://supermaster.blog.51cto.com//
首先定义0在计算机中储存为00000000,对于正数我们依然可以像无符号数那样换算,从00000001到0依次表示1到127。那么这些数对应的二进制码就是这些数的原码。到这里很多人就会想,那负数是不是从到依次表示-1到-127,那你发现没有,如果这样的话那么一共就只有255个数了,因为的情况没有考虑在内。
实际上,在计算机中表示最小的负整数,就是这里的-128,而且实际上并不是从到依次表示-1到-127,而是刚好相反的,从到依次表示-127到-1。
负整数在计算机中是以补码形式储存的,补码是怎么样表示的呢,这里还要引入另一个概念——反码,所谓反码就是把负数的原码除符号位(负数的原码除符号位和它的绝对值所对应的原码相同,简单的说就是绝对值相同的数原码相同)各个位按位取反,是1就换成0,是0就换成1,如-1的原码是0000001(注意这里只有7位,不看符号位,我这里所说的负数符号位都是1),和1的原码相同,那么-1的反码就是(这也是7位,后面加上了符号位都是8位了),而补码就是在反码的基础上加1,即-1的补码是+1=,因此我们可以算出-1在计算机中是按储存的。总结一下,计算机储存有符号的整数时,是用该整数的补码进行储存的,0的原码、补码都是0,正数的原码、补码可以特殊理解为相同,负数的补码是它的反码加1。下面再多举几个例子,来帮助大家理解!
//— 2008年6月23日补充:
很久没有来这里了,如果不是看到有人给我私人留言被转发到我以前的老邮箱去了,我可能还不知道什么时候才发现那个“-1的反码就是”的问题,看了N多批评后,觉得实在对不起各位,我已经在上面更正了,改成了7位,其实当时也是这么想的,为什么我要把符号位单独拿出来先不考虑,因为。。 -128。。呵呵,自己想想为什么吧。。这个帖子好像改过几次了吧,而且当时是边想边写,如果有语言组织好的(我看到很多大学生来到了这里),归纳一下吧,只希望也和我一样,就像对一个完全不懂的人讲解,因为我深知很多想学技术通常就是被拦在了最初的门槛,其实起步了后面都不是大事,谢谢了,也算是为后来人服务吧。
//—
十进制 → 二进制 (怎么算?要是不知道看计算机基础的书去)
47 →
有符号的整数 原码 反码 补码
47 00 00 00(正数补码和原码、反码相同,不能从字面理解)
-47 (负数补码是在反码上加1)
再举个例子,学C语言的同学应该做过这道题:
把-1以无符号的类型输出,得什么结果?(程序如下)
#include
void main()
{
short int n=-1;
cout<<(unsigned short int)n<
}
首先在我的电脑中short int类型的储存空间是2个字节,你的可能不同,我说过,这取决于你的计算机配置。它能储存28*2=65536个不同的数据信息,如果是无符号那么它的范围是0~65535(0~216-1),如果是有符号,那么它的范围是-32768~32767(-215~215-1)。这道题目中,开始n是一个有符号的短整型变量,我们给它赋值为-1,根据我们前面所说的,它在计算机中是以补码 储存的,注意前面说了是2个字节。如果把它强制为无符号的短整型输出的话,那么我们就把刚才的二进制把看成无符号的整型在计算机中储存的形式,对待无符号的整型就没有什么原码、反码和补码的概念了,直接把 转化成十进制就是65535,其实我们一看都是一就知道它是范围中最大的一个数了。呵呵,就这么简单。你个把上面的源代码编译运行看看,如果你的电脑short int也是两个字节,那就会和我得一样的结果。你可以先用这个语句看看:cout<<< FONT>看看你的电脑里的短整型占多少的储存空间,也可以用sizeof来看其它任何类型所分配的储存空间。
最后提醒一句,关于数据如何在计算机中储存的,这里只适用于整型的数据,对于浮点型的是另一种方式,这里我们暂时就不深究了。本文出自 51CTO.COM技术博客
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/177519.html原文链接:https://javaforall.net
