📄 理解有符号数和无符号数 - java-jinguo - javaeye技术网站.htm
字号:
<BR><BR>再举一例,我们来看整数-1在计算机中如何表示。 <BR><BR>假设这也是一个int类型,那么: <BR><BR>
<BR><BR>1、先取1的原码:00000000 00000000 00000000 00000001
<BR><BR>2、得反码: 11111111 11111111 11111111 11111110
<BR><BR>3、得补码: 11111111 11111111 11111111 11111111
<BR><BR> <BR><BR>可见,-1在计算机里用二进制表达就是全1。16进制为:0xFFFFFF。 <BR><BR>码、反码、补码 <BR><BR>
<BR><BR>结束了各种进制的转换,我们来谈谈另一个话题:原码、反码、补码。 <BR><BR>
<BR><BR>我们已经知道计算机中,所有数据最终都是使用二进制数表达。 <BR><BR>我们也已经学会如何将一个10进制数如何转换为二进制数。
<BR><BR>不过,我们仍然没有学习一个负数如何用二进制表达。 <BR><BR> <BR><BR>比如,假设有一 int
类型的数,值为5,那么,我们知道它在计算机中表示为: <BR><BR>00000000 00000000 00000000 00000101
<BR><BR>5转换成二制是101,不过int类型的数占用4字节(32位),所以前面填了一堆0。 <BR><BR>现在想知道,-5在计算机中如何表示?
<BR><BR> <BR><BR>在计算机中,负数以其正值的补码形式表达。 <BR><BR>什么叫补码呢?这得从原码,反码说起。 <BR><BR>
<BR><BR>原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。 <BR><BR>比如 00000000 00000000 00000000
00000101 是 5的 原码。 <BR><BR> <BR><BR>反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
<BR><BR>取反操作指:原为1,得0;原为0,得1。(1变0; 0变1) <BR><BR>比如:将00000000 00000000 00000000
00000101每一位取反,得11111111 11111111 11111111 11111010。 <BR><BR>称:11111111 11111111
11111111 11111010 是 00000000 00000000 00000000 00000101 的反码。
<BR><BR>反码是相互的,所以也可称: <BR><BR>11111111 11111111 11111111 11111010 和 00000000
00000000 00000000 00000101 互为反码。 <BR><BR> <BR><BR>补码:反码加1称为补码。
<BR><BR>也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。 <BR><BR>比如:00000000 00000000
00000000 00000101 的反码是:11111111 11111111 11111111 11111010。 <BR><BR>那么,补码为:
<BR><BR>11111111 11111111 11111111 11111010 + 1 = 11111111 11111111 11111111
11111011 <BR><BR> <BR><BR>所以,-5 在计算机中表达为:11111111 11111111 11111111
11111011。转换为十六进制:0xFFFFFFFB。 <BR><BR> <BR><BR>再举一例,我们来看整数-1在计算机中如何表示。
<BR><BR>假设这也是一个int类型,那么: <BR><BR> <BR><BR>1、先取1的原码:00000000 00000000 00000000
00000001 <BR><BR>2、得反码: 11111111 11111111 11111111
11111110 <BR><BR>3、得补码: 11111111 11111111 11111111
11111111 <BR><BR> <BR><BR>可见,-1在计算机里用二进制表达就是全1。16进制为:0xFFFFFF。
<BR><BR><BR>计算机原理-原码、反码、补码
<BR><BR>更多内容:http://www.juqingshow.com/jsjyuanli/200701/7687.html
<BR>首先要说的是:计算机中的带符号数一般用补码表示 <BR><BR>计算机中的带符号数用补码表示的优点:
<BR>1、负数的补码与对应正数的补码之间的转换可以用同一种方法——求补运算完成,可以简化硬件; <BR>2、可将减法变为加法,省去减法器;
<BR>3、无符号数及带符号数的加法运算可以用同一电路完成。 <BR><BR>带符号数的表示 <BR><BR><BR>先引进两个名词:机器数和真值。
<BR><BR>将一个数在机器中的表示形式,即编码称为机器数,数的本身称为真值。平常我们经常用的带符号的数就是真数,如:+50,-10.5等等。
<BR><BR>常用的机器数有三种:原码、补码和反码。 <BR><BR><BR><BR><BR>1.原码 <BR><BR>
通俗定义 <BR><BR> 将数的符号数码化,即用一个二进制位表示符号:对正数,该位取0,对负数,该位取1。
<BR><BR>而数值部分保持数的原有形式(有时需要在高位部分添几个0)。这样所得结果为该数的原码表示。
<BR><BR><BR> 例,x=+1001010,y= -1001010,z= 一1110(=
一0001110)。当原码为8位时,x、y和z的原码分别是: <BR><BR> [x]原=01001010;
<BR><BR> [y]原=11001010; <BR><BR>
[Z]原=10001110. <BR><BR>其中最高位为符号位。 <BR><BR>2)正规定义 <BR><BR><BR><BR><BR>2.反码
<BR><BR><BR><BR><BR><BR><BR>反码:正数的反码为原码,负数的反码是原码符号位外按位取反。 <BR><BR>例如:
<BR><BR>X1=+67=+100 0011B
,[X1]反=0100 0011B X2=-67=-100
0011B ,[X2]反=1011 1100B
<BR>对正数,其反码与原码相同,也与补码相同。对负数,其反码等于原码除符号位外,按位求反(末位不加1)。利用反码也可使带符号数的加、减法转化为单纯的加法,但麻烦一些。
<BR><BR>一般把求反码作为求补的中间过程,即 [x]补=[x]反+1。 <BR><BR><BR><BR><BR>3.补码
<BR><BR><BR>1)补码的引进和定义 <BR><BR>
据统计,在所有的运算中,加、减运算要占到80%以上,因此,能否方便地进行正、负数加、减运算,直接关系到计算机的运行效率。
<BR><BR>把一个负数加模的结果称为该负数的补码(结果是一个正数,它和该负数是等价的,确切地说,是一对一的,因而可看作是该负数的编码),定义正数的补码就是它本身,符号位取0,即和原码相同。这就是补码的通俗定义。将这个定义用数学形式表示出来,就可得到补码的正规定义:
<BR><BR><BR><BR><BR><BR><BR><BR><BR>其中n为补码的位数。这个定义实际也将真值的范围给出来了,当n=8时,一27≤x<27。和原码相比,补码表示可多表示一个数。当n=8时,多表示的数是一27=一128。
<BR><BR><BR> 2)补码的求法 <BR><BR><BR> 对正数,补码同原码。
<BR><BR>
例如,x=+0101001,[x]补=[x]原=00101001。
<BR><BR>
对负数,由定义求补码,需做减法,不方便。经推导可知,负数的补码等于其原码除符号位外按位“求反”(1变0,0变1),末位再加1。
<BR><BR>
例如,y=一0001100,[y]原=10001100,[Y]补=11110011+1=11110100。
<BR><BR><BR>•算法:1.正数的补码与原码相同; 2.负数的补码由原码除符号位保持不变外,其余各位按位取反,再在末位加1。
[x]补=[x]反+1 • <BR><BR><BR><BR><BR>
多做几例,可得出一种心算求补的方法——从最低位开始至找到的第一个1均不变,符号位不变,这之间的各位“求反”(该方法仅用于做题)。
<BR><BR><BR><BR><BR><BR></DIV>
<DIV class=blog_bottom>
<UL>
<LI>15:21 </LI>
<LI>浏览 (753) </LI>
<LI><A href="http://jinguo.javaeye.com/blog/212049#comments">评论</A> (0) </LI>
<LI>分类: <A href="http://jinguo.javaeye.com/category/35247">java 语法基础</A> </LI>
<LI class=last><A class=more href="http://www.javaeye.com/wiki/topic/212049"
target=_blank>相关推荐</A> </LI></UL></DIV>
<DIV class=blog_comment>
<H5>评论</H5><A id=comments name=comments></A></DIV>
<DIV class=blog_comment>
<H5>发表评论</H5>
<FORM id=comment_form onsubmit="return false;" action=/blog/212049
method=post><INPUT id=editor_bbcode_flag type=hidden>
<DIV id=editor_main><TEXTAREA class="validate-richeditor bad-words min-length-5" id=editor_body style="WIDTH: 500px; HEIGHT: 350px" name=comment[body] rows=20 cols=40></TEXTAREA></DIV>
<SCRIPT type=text/javascript> var editor = new Control.TextArea.Editor("editor_body", "bbcode", false);</SCRIPT>
<P style="PADDING-RIGHT: 30px; TEXT-ALIGN: right">您还没有登录,请<A
href="http://jinguo.javaeye.com/login">登录</A>后发表评论 <INPUT class=submit id=submit_button type=submit value=提交 name=commit></P></FORM>
<SCRIPT type=text/javascript> new Validation("comment_form", {immediate: false, onFormValidate: function(result, form){ if(confirm('您需要登录以后才能执行这个操作,现在要登录吗?')) window.location.href = '/login'; }}); </SCRIPT>
</DIV></DIV>
<SCRIPT type=text/javascript> dp.SyntaxHighlighter.HighlightAll('code', true, true); fix_image_size($$('div.blog_content img'), 700); function quote_comment(link) { var quote_user = $(link).previous(0).innerHTML; var quote_body = $(link).up().next().innerHTML.stripTags(); editor.bbcode_editor.textarea.insertAfterSelection('[quote="'+quote_user+'"]\n' + quote_body + '\n[/quote]\n'); }</SCRIPT>
</DIV>
<DIV id=local>
<DIV class=local_top></DIV>
<DIV id=blog_owner>
<DIV id=blog_owner_logo><A href="http://jinguo.javaeye.com/"><IMG class=logo
title="loving863的博客: Java-Jinguo" alt=用户头像
src="理解有符号数和无符号数 - Java-Jinguo - JavaEye技术网站.files/d2ac9857-26cc-3796-8565-20722ebf8ec3.png"></A></DIV>
<DIV id=blog_owner_name>loving863</DIV></DIV>
<DIV id=blog_actions>
<UL>
<LI>浏览: 31178 次
<LI>性别: <IMG title=男 alt=Icon_minigender_1
src="理解有符号数和无符号数 - Java-Jinguo - JavaEye技术网站.files/icon_minigender_1.gif">
<LI>来自: 上海
<LI><IMG src="理解有符号数和无符号数 - Java-Jinguo - JavaEye技术网站.files/offline.gif">
<LI><A class=profile href="http://jinguo.javaeye.com/blog/profile">详细资料</A> <A
class=guest_book href="http://jinguo.javaeye.com/blog/guest_book">留言簿</A>
</LI></UL>
<H5>搜索本博客</H5>
<FORM action=/blog/search method=get><INPUT class=text id=query
style="MARGIN-LEFT: 10px; WIDTH: 110px" name=query> <INPUT class=submit type=submit value=搜索> </FORM></DIV>
<DIV class=clearfix id=user_visits>
<H5>最近访客</H5>
<DIV class=left>
<DIV class=clearfix>
<DIV class=logo><A href="http://studyuse.javaeye.com/" target=_blank><IMG
class=logo title="studyuse的博客: " alt=用户头像
src="理解有符号数和无符号数 - Java-Jinguo - JavaEye技术网站.files/user-logo-thumb.gif"></A></DIV></DIV><A
href="http://studyuse.javaeye.com/" target=_blank>studyuse</A> </DIV>
<DIV class=left>
<DIV class=clearfix>
<DIV class=logo><A href="http://mrjamesli.javaeye.com/" target=_blank><IMG
class=logo title="mrjamesli的博客: mrjamesli" alt=用户头像
src="理解有符号数和无符号数 - Java-Jinguo - JavaEye技术网站.files/user-logo-thumb.gif"></A></DIV></DIV><A
href="http://mrjamesli.javaeye.com/" target=_blank>mrjamesli</A> </DIV>
<DIV class=left>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -