導航:首頁 > 源碼編譯 > 源碼表示負數的符號擴展

源碼表示負數的符號擴展

發布時間:2024-10-11 20:04:46

A. C語言中用%X輸出一個long long型的十六進制數,當這個數是負數時,怎麼讓它符號位擴展用F補全

你的編譯器得支持64位整形數才行。
這樣的話long long就是64位的數,
輸出可改為:
printf("0X%016LLX",b);

否則的話只能變通一下:
if(b<0)printf("0XFFFFFFFF%8X",b);
else printf("0X%016X",b);

B. +0或者-0的源碼、反碼、補碼

[+0]原碼=0000 0000, [-0]原碼=1000 0000

[+0]反碼=0000 0000, [-0]反碼=1111 1111

[+0]補碼=0000 0000, [-0]補碼=0000 0000

你會發現,+0和-0的補碼是一樣的。即 0的補碼只有一種表示。

這里解釋一下[-0]補碼是怎麼得來的。

負數的補碼就是反碼整體加一。符號位上的進位舍棄。(所以,舍棄了符號位的補碼的第一位是數值位,不是符號位,符號位舍棄了)

另外解釋一下原碼符號位和補碼符號位的關系,補碼的符號位不是保持原碼的第一位不變,而是 符號位不變,[-0]反碼的第一個1是符號位,尾數中的7個1是數值位,尾數加一後,數值位產生了進位,1111 1111+1=1 0000 0000(計算補碼的過程中,並不是先保證第一位不變,而是保證符號位不變,保證補碼規則是反碼整體加一)。

所以,補碼能表示的數的個數中,比原碼反碼少了一個,所以補碼可以多表示一個真值為-128的數。

但是,多表示的這個數-128比較特殊,只有原碼和補碼,沒有反碼。

-128的補碼是1000 0000。128的補碼為什麼是1000 0000。因為8位二進制的原值表達范圍為:-127至127,共有256個組合序列 0000 0000 至1111 1111 。+128的原值在8位中是表達不出來的。

(2)源碼表示負數的符號擴展擴展閱讀:

數值在計算機中是以補碼的方式存儲的,在探求為何計算機要使用補碼之前, 讓我們先了解原碼, 反碼和補碼的概念。

對於一個數, 計算機要使用一定的編碼方式進行存儲。 原碼, 反碼, 補碼是計算機存儲一個具體數字的編碼方式。

一個數在計算機中的二進製表示形式, 叫做這個數的機器數。

機器數是帶符號的,在計算機用一個數的最高位存放符號, 正數為0, 負數為1。比如,十進制中的數 +2 ,計算機字長為8位,轉換成二進制就是[00000010]。如果是 -2 ,就是 [10000010] 。

因為第一位是符號位,所以機器數的形式值就不等於真正的數值。例如上面的有符號數 [10000010],其最高位1代表負,其真正數值是 -2 而不是形式值130([10000010]轉換成十進制等於130)。

所以將帶符號位的機器數對應的真正數值稱為機器數的真值。

參考資料:

原碼_網路

反碼_網路

補碼_網路

C. +0或者-0的源碼、反碼、補碼

[+0]原碼=0000 0000, [-0]原碼=1000 0000

[+0]反碼=0000 0000, [-0]反碼=1111 1111

[+0]補碼=0000 0000, [-0]補碼=0000 0000

補碼沒有正0與負0之分。正數的反碼、補碼和其源碼相同,負數的反碼是其源碼,除符號位外其他位取反負數的補碼是取其反碼後加1。

詳細釋義:

所謂原碼就是二進制定點表示法,即最高位為符號位,「0」表示正,「1」表示負,其餘位表示數值的大小。

(一)反碼表示法規定:

1、正數的反碼與其原碼相同;

2、負數的反碼是對正數逐位取反,符號位保持為1;

(二)對於二進制原碼10010求反碼:

((10010)原)反=對正數(00010)原含符號位取反= 反碼11101 (10010,1為符號碼,故為負)

(11101) 二進制= -2 十進制

(三)對於八進制:

舉例 某linux平台設置了默認的目錄許可權為755(rwxr-xr-x),八進製表示為0755,那麼,umask是許可權位755的反碼,計算得到umask為0022的過程如下:

原碼0755= 反碼 0022 (逐位解釋:0為符號位,0為7-7,2為7-5,2為7-5)

(四)補碼表示法規定:正數的補碼與其原碼相同;負數的補碼是在其反碼的末位加1。

(3)源碼表示負數的符號擴展擴展閱讀

轉換方法

由於正數的原碼、補碼、反碼表示方法均相同,不需轉換。在此,僅以負數情況分析。

(1) 已知原碼,求補碼。

例:已知某數X的原碼為10110100B,試求X的補碼和反碼。

解:由[X]原=10110100B知,X為負數。求其反碼時,符號位不變,數值部分按位求反;求其補碼時,再在其反碼的末位加1。

1 0 1 1 0 1 0 0 原碼

1 1 0 0 1 0 1 1 反碼,符號位不變,數值位取反

1 +1

1 1 0 0 1 1 00 補碼

故:[X]補=11001100B,[X]反=11001011B。

(2) 已知補碼,求原碼。

分析:按照求負數補碼的逆過程,數值部分應是最低位減1,然後取反。但是對二進制數來說,先減1後取反和先取反後加1得到的結果是一樣的,故仍可採用取反加1 有方法。

例:已知某數X的補碼11101110B,試求其原碼。

解:由[X]補=11101110B知,X為負數。

採用逆推法

1 1 1 0 1 1 1 0 補碼

1 1 1 0 1 1 0 1 反碼(末位減1)

1 0 0 1 0 0 1 0 原碼(符號位不變,數值位取反)

閱讀全文

與源碼表示負數的符號擴展相關的資料

熱點內容
如何用IIS搭建網站伺服器 瀏覽:745
app如何清理本地緩存 瀏覽:280
婷婷我的解壓方式 瀏覽:472
m1max編譯速度 瀏覽:727
交互命令窗口 瀏覽:329
java類域 瀏覽:973
java字元串分隔符 瀏覽:864
python繪制散點圖 瀏覽:491
rc4演算法分析 瀏覽:393
清理手機app什麼意思 瀏覽:493
區域網怎麼架設列印伺服器 瀏覽:523
遼寧299伺服器雲空間 瀏覽:429
pdf怎麼轉換成word轉換器 瀏覽:868
pdf書譜 瀏覽:559
伺服器運維網路搭建是什麼意思 瀏覽:231
阿里伺服器放海底是為了什麼 瀏覽:526
讀取商品條形碼單片機 瀏覽:396
伺服器未掛載是什麼情況 瀏覽:306
如何在伺服器過白名單 瀏覽:282
單片機按下開關燈亮 瀏覽:221