C語言補碼的相關問題

2022-03-15 21:34:47 字數 5300 閱讀 9753

1樓:心奮

那就肯定是書上整錯了,你看的是第幾版,我查的是第三版,新的肯定會糾正前一版的錯誤。

另外,我用「c程式設計 譚浩強 錯誤」作為關鍵字搜尋,發現有專門的錯誤彙總,說實話,還真不少,你應該看最新版的,也就是第四版。(這本書作為初學者的入門書,有些描述不夠嚴謹可以接受,不過出錯就不應該了)

回到問題本身,-32768 用 16 位的補碼錶示本來就是 1000000000000000,即使第三版裡不這麼寫它也是這樣的,何況在第三版裡它已經改正了。

這個也是可以自己寫程式證明的,你應該嘗試著自己去解決,知道怎麼把十進位制數轉換成二進位制嗎?我記得我看的書上是有的。

寫一個遞迴程式,根據自己學習 c 語言的程度,自己獨立完成或查資料後搞明白了自己再寫。

等完成後,-23768 怎麼表示就很清楚了,這還可以鍛鍊你的程式設計能力。

看到你說是老譚說的,我就覺得奇怪了,這個題又不難,程式一寫就知道答案了,教科書上還給寫錯了?

為此我查了《c程式設計(第三版)》(譚浩強著),在講述整型變數的那一段找到了你所說的描述,給出截圖:

這個題目的講解和你的理解是一樣的,最終 b 的值就是 1 後面 15 個 0.

這涉及到補碼的計算方法問題,你所說的 b = -32768 表示成 1111111111111111 是錯誤的。

b 是 short 型別,也就是說它佔用 2 個位元組儲存,根據你的宣告,b 是有符號的整數,它的首位用來標識正負,那麼它所能表示的範圍是 -32768 ~ 32767;如果你將 b 宣告成無符號的整數(unsigned short),那麼它的表示範圍是 0 ~ 65535。

32768 的二進位制表示:1000000000000000(注意,它的長度是16位,而不是你下面那個算式所寫的17位,有可能是你數錯了)

1000000000000000 表示成有符號數就是 -32768。

負數的補碼翻譯成十進位制,演算法:取反後加1,再加負號。

補碼:1000000000000000

取反:0111111111111111

加1 :1000000000000000 (=32768)

加負號:-32768

2樓:匿名使用者

一:你用的是windows作業系統做的測試。

二:在windows作業系統中,一個int值佔用四位byte,也就是四個char。

三:前兩個char儲存的是int 值得 後16bit,後兩個char儲存的是前16個bit。

明白了麼?

3樓:day年藥

short 佔2個位元組,第一位是符號位,如果第一位是1就表示他是負數,並且是用補碼錶示既1000000000000000(你上面的寫錯了)他的對應的正數是1000000000000000(32768)

4樓:匿名使用者

你考慮符號位沒有,用unsigned int試試

5樓:匿名使用者

資料是以補碼的形式存在的 加1 是在補碼上加1 符號位不變 你再算一下

6樓:

short是2位元組的,你用long試試看

7樓:乀你若浮生若夢

原始碼 反碼 +1補碼

計算機組成原理問題,有關原碼,補碼的定義

8樓:手氣不錯

問題一:

原碼中,0有兩種表示形式:1(符號位)000與0(符號位)000

你可能認為這是多餘,恰恰相反,這是必要的。所以定義中才要強調【≥】。

至於為什麼必要,鄙人猜測是能使計算機更好的表達【數的極限】。

比如 lim(a→負0) = 原碼負0,lim(a→正0) = 原碼正0

或許還有別的用途。鄙人沒能查到。但樓主要相信 定義中強調了必要性。

問題二:

樓主是不是被0.0000和1.0000的小數點迷惑了? 那是唐朔飛為了讓你看清楚 故意點個點。

那不是小數點,而是分隔符號位和絕對值位的【標誌】。

整數0和小數0不是一回事。小數0是科學計數法(浮點數)記的。

問題三:

******-1都不是小數,怎麼能用小數補碼的定義求x=-1的補碼呢?*******

按道理說,-1不是小數,它根本就沒有【小數補碼形式】,而只可能擁有【整數補碼形式】。

可是當人們定義出【小數補碼定義】時,驚奇的發現,如果把-1當作小數而去用【小數補碼定義】求它的「小數補碼」,它居然是符合規則的。那果斷批准,批准-1擁有小數補碼形式!

(樓主現在應該知道了,這是假設惹的禍。-1固然不是小數,但假設它是小數,於是發現了新大陸——-1的小數補碼錶示法)而這個假設是有根據的,它的根據就是下面這句話:

【小數補碼定義】決定了【-1雖然不是小數,但它可以通過小數補碼來表示】

樓主請盡情的批 判唐朔飛吧。他的意思是對的,可是寫出來容易被誤解成以下:

使用【哪種碼】(比如原碼、補碼) 和他們表示的是【整數0還是小數0】是兩個概念!

整數0 有原碼錶示、補碼錶示等,小數0 階碼尾數也分原碼錶示、補碼錶示,

唐朔飛相當於在說「小數0不是補碼吶」這根本就是兩個概念。

下面是我重新寫的課文,供樓主參考:

//p223 l17

當用補碼錶示小數時,由於補碼不像原碼那樣有正負0之分,所以比原碼能額外表示1個數,

這個額外能表示的數——根據定義——就是-1,雖然它並不是小數,但是在【小數補碼】的世界裡,可以用【小數的形態】表示出-1這個整數。 我們人類在數學上認為-1是整數,而在

補碼計算機的眼中,-1就好像是一個小數一樣,和別的小數(補碼)擁有相同的形態。

9樓:做而論道

補碼,在計算機中存放時,並沒有小數點。

這本書中,加上了小數點,只是用於醒目,把符號位,隔離出來而已。他們並不是常規的小數。

理解帶符號數,應該從補碼開始。

原碼、反碼,只是求補碼的中間過程,不用多費心思。

建議看看:

10樓:沙裡波特

計算機中,只有 1、0 這兩種**,並沒有小數點。

在這本書中,平白無故的加上了小數點,屬於誤導。

作者不懂實際的東西,只是自說自話,胡言亂語,就不必再看了。

理解帶符號數,應該從補碼開始。

原碼、反碼,只是求補碼的中間過程,不用多費心思。

計算機內部如何儲存資料,關於原始碼、補碼的問題!

11樓:匿名使用者

1.補碼

(1)正數的補碼

與原碼相同。   【例1】+9的補碼是00001001。(備註:

這個+9的補碼說的是用8位的2進位制來表示補碼的,補碼錶示方式很多,還有16位2進位制補碼錶示形式,以及32位2進位制補碼錶示形式等。)

(2)負數的補碼

符號位為1,其餘位為該數絕對值的原碼按位取反;然後整個數加1。   同一個數字在不同的補碼錶示形式裡頭,是不同的。比方說-15的補碼,在8位2進位制裡頭是11110001,然而在16位2進位制補碼錶示的情況下,就成了1111111111110001。

在這篇補碼概述裡頭涉及的補碼轉換預設了把一個數轉換成8位2進位制的補碼形式,每一種補碼錶示形式都只能表示有限的數字。

原碼原碼(true form)是一種計算機中對數字的二進位制定點表示方法。原碼錶示法在數值前面 原碼

增加了一位符號位(即最高位為符號位),該位為0表示正數或者0(當為0時第一位不能為1,因為如果把10000000也當成0會造成和-128原碼衝突),該位為1表示負數,其餘位表示數值的大小。

反碼所謂原碼就是二進位制定點表示法,即最高位為符號位,「0」表示正,「1」表示負,其餘位表示數值的大小。   反碼錶示法規定:正數的反碼與其原碼相同;負數的反碼是對其原碼逐位取反,但符號位除外。

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

2. (1)、在計算機系統中,數值一律用補碼來表示(儲存)。 主要原因:

使用補碼,可以將符號位和其它位統一處理;同時,減法也可按加法來處理。另外,兩個用補 碼錶示的數相加時,如果最高位(符號位)有進位,則進位被捨棄。

(2)、補碼與原碼的轉換過程幾乎是相同的

3. 2.^4+2.^1 = 17 表示 17

謝謝 採納

12樓:匿名使用者

1.資料分為有符號數和無符號數,無符號數都為正數,由十進位制直接轉換到二進位制即可。而無符號數以首位地址來表示正負,正數的首位地址為0,其原始碼是由十進位制數轉換到的二進位制數字,負數的首位地址為1,其原始碼後面的位也為10進位制數轉換過去的二進位制數字。

但是計算內為了儲存及運算方便,加入了反碼和補碼的定義,正數的反碼和補碼與原始碼一致,而負數的反碼為除了首地址以外,所有的位都取反,因此得名反碼,而補碼是在反碼的基礎上,再補上一個1。

2. 因此,原始碼是為了便於我們自己**和計算,而計算機內為了運算及儲存的方便,儲存的都是補碼,反碼是兩者轉換的中間過程。

3. 如00010010,最高位是0,所以不管其是有符號數還是無符號數,均為正數,後面7位看1的位置,第5位和第2位為1,因此為2^4+2^1=18.

如10010010(原始碼),如果是無符號數,那麼為2^7+2^4+2^1=146;如果為有符號數,最高位為1,因此為負數,-(2^4+2^1)= -18. 原始碼10010010 反碼11101101 在計算機儲存的補碼11101110。

13樓:何處淬吳鉤

1、原碼就是一個數的二進位制形式。

把原碼按位取反就是反碼。

補碼分正負兩種情況。正數的補碼與原碼相同。負數的補碼符號位為1,其餘位為該數絕對值的原碼按位取反;然後整個數加1

2、補碼。

3、不確定。如果是定點整數,因最高位是0,所以無論其為有符號還是無符號數,都是2^4+2^1= 18。但如果是浮點數的話,我用腦子無法計算出,只能上機執行來得到答案。

14樓:匿名使用者

原始碼,反碼,補碼是計算機原理的術語。說白了就是為了理解計算機2進位制用的。對於c/c++來說,是和資料型別有關的。

整型(包括 char ,short, int, long)都是用補碼方式表示有符號數的。

無符號數是使用原始碼方式表示的。float和double型別是使用階碼移碼方式儲存資料的。

計算機內部是2進位制儲存的,吧一個儲存看作一定型別的資料,就對應著這種型別的計算。

如果沒有型別作為依託,你的假設就不成立了,所以不能說它到底表示是幾。

如果是整型型別,因為第一個位是0,所以不論有符合還是無符號,它都是一個正數;那麼可以認為它表示十進位制數字18

C語言相關問題

for i 0,j strlen str i 此程式段應該為字串逆序重放。將字元陣列第一個字元與最後一個互換.既str i 與str j 1 互換,10個字元換5次,9個字元換4次.將字元陣列的前一半字元和後面的字元,以中間的字元為對稱軸進行交換 舉個例子 abcdefgh偶數長 則應該將 0 7 ...

c語言的原碼反碼補碼是什麼意思C語言的原碼,反碼,補碼是什麼意思?

1 原碼錶示 原碼錶示 法是機器數的一種簡單的表示法。其符號位用0表示正號,用 表示負號,數值一般用二進位制形式表示。設有一數為x,則原碼錶示可記作 x 原。例如,x1 1010110 x2 一1001010 其原碼記作 x1 原 1010110 原 01010110 x2 原 1001010 原 ...

c語言的問題,C語言的問題

union是聯合體,其中的所有變數共用一片記憶體空間,該空間長度為union中最長的變數長度,即int陣列i 2 的長度8。union會牽涉到大小端問題,而題中給出的陣列的第0個元素在低位並不能說明機器為大端序還是小端序,因為陣列的生長方向永遠向上,和大小端以及堆疊的生長方向沒有關係。這意味著這道題...