?? 理解有符號數和無符號數 - 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 + -