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個元素在低位並不能說明機器為大端序還是小端序,因為陣列的生長方向永遠向上,和大小端以及堆疊的生長方向沒有關係。這意味著這道題...