c語言負數補碼
⑴ c語言負數的補碼怎麼轉換的如-12345怎麼轉化為53191的
數在計算機中是以二進制形式表示的。
數分為有符號數和無符號數。
原碼、反碼、補碼都是有符號定點數的表示方法。
一個有符號定點數的最高位為符號位,0是正,1是副。
以下都以8位整數為例,
原碼就是這個數本身的二進制形式。
例如
1000001
就是-1
0000001
就是+1
正數的反碼和補碼都是和原碼相同。
負數的反碼是將其原碼除符號位之外的各位求反
[-3]反=[10000011]反=11111100
負數的補碼是將其原碼除符號位之外的各位求反之後在末位再加1。
[-3]補=[10000011]補=11111101
一個數和它的補碼是可逆的。
為什麼要設立補碼呢?
第一是為了能讓計算機執行減法:
[a-b]補=a補+(-b)補
第二個原因是為了統一正0和負0
正零:00000000
負零:10000000
這兩個數其實都是0,但他們的原碼卻有不同的表示。
但是他們的補碼是一樣的,都是00000000
特別注意,如果+1之後有進位的,要一直往前進位,包括符號位!(這和反碼是不同的!)
[10000000]補
=[10000000]反+1
=11111111+1
=(1)00000000
=00000000(最高位溢出了,符號位變成了0)
有人會問
10000000這個補碼表示的哪個數的補碼呢?
其實這是一個規定,這個數表示的是-128
所以n位補碼能表示的范圍是
-2^(n-1)到2^(n-1)-1
比n位原碼能表示的數多一個
⑵ 在c語言中怎麼表示負數。
第一位符號位1為負,0為正。 正數的補碼和2進制原碼是一樣的。
負數的補碼:
1、先取絕對值|x| ;
2、對|X|+1 ;
3、對|X|+1 取反,就得到它的補碼了 。
計算機中存放整型數據都是按補碼的形式存放的。
(2)c語言負數補碼擴展閱讀:
有符號數的表示方法是由硬體決定,而不是由C決定的。有三種表示方法:
1、二進制原碼
0000 0001 表示 1
1000 0001 表示 -1
這個方法有個缺點是有兩個零: +0 和 -0。這會引起混淆,而且用兩個位組合來表示一個值也有些浪費。
2、二進制補碼(最普遍的系統)
區別在於 singned 和 unsigned:
1)如果是無符號位元組, 1000 0000 該組合為 128
2)如果是有符號位元組, 1000 0000 該組合為 -128
第一種表示數的范圍是 0 ~ 255;
第二種表示數的范圍是 -128 ~ +127,對於一個二進制補碼數取負數,最簡單的方法就是取反、加 1。
3、二進制反碼
通過反轉位組合中的每一位以形成一個數的負數,例如:
0000 0001 表示 1
1111 1110 表示 -1
這種方式也有一個 -0:1111 1111。其范圍是 -127 ~ +127。
⑶ C語言中負數的補碼的問題
譚浩強說的方法適用於數字位數小於字長的情況,也就是符號位不能被覆蓋。像-127,只有在規定字長大於8位(含符號位)的情況下,才能適用。兩種方法都可以。譚浩強寫的很多東西都喜歡把簡單的東西復雜化,讓新手反而不理解了。最直觀的理解方法就是方法1,負數符號位就是1,符號位不變,把去掉符號位後的絕對值部分取反,然後加1,就是負數的補碼。
⑷ C語言中為什麼用補碼表示負數,而不是直接在正數的前面加1呢
為什麼用補碼表示負數?
原理:用加法運算,也可以產生減法的效果。
目的:簡化計算機的硬體。
在兩位數之內,+99,就可以代替-1。
如:24 - 1 = 23
24 + 99 = (1) 23
只取兩位,這兩種演算法,功能就是相同的。
加上 99,就相當於,減一!
物極必反,聽說過吧?
99,就是-1 的補數。
-------------------
鍾表的分針,正撥 59,也相當於倒撥 1 分鍾!
-------------------
計算機用二進制,就改稱為:補碼。
八位二進制:0000 0000~1111 1111(十進制255)。
255(=1111 1111),就是-1 的補碼。
254(=1111 1110),就是-2 的補碼。
。。。
負數的補碼 = 2^n + 該負數。(n 是二進制的位數。)
藉助於補碼,在計算機中,只需配置一個加法器,即可。
正數,沒有補碼,直接參加計算即可。
⑸ 為什麼c語言中可以用補碼來表示負數
不是c語言用補碼表示負數,而是計算機用補碼表示負數
因為用補碼的話,加法器直接做加減運算就可以了,不再需要考慮正負號問題
⑹ c語言初學者求解關於負數補碼存儲
出去曬曬太陽吧,原理明白了就好,沒必要鑽牛角尖。
計算機存儲都是二進制,八進制和十六進制亦或十進制都是用來輸入輸出表示的,如果你的程序用來編輯或顯示內存實際數據,一般用十六進制顯示,因為十六進制相對二進制簡短而且1位16進制對應4位二進制,非常整齊,為了方便。如果你的程序用來計算一般應用,則以10進制顯示,同樣為了方便,特殊要求可以用其他任意進制顯示,根據你需求哪個方便用哪個。
編程語言中,如果定義為整數(int),計算機遇到負數就以補碼表示,此時0xffff即為-1;如果定義為uint,則不允許賦值負數(強制轉換除外),如果其值為0xffff,則表示正的65535。所以關鍵在於定義(事先約定)。
而當你得到一個數據0xffff,如果不告訴你約定,或者說數據類型,你是無法知道到底表示-1還是65535的,計算機也如此。
⑺ C語言中負數的補碼怎麼求
正數,本身就是補碼。
負數,就用它的正數,減一取反,即可得到補碼。
如,已知:+9 的二進制是:00001001。
下面求-9補碼:
先減一:00001001-1=00001000;
再取反:11110111。
所以有:-9補碼=11110111。
這不就完了嗎!
簡不簡單?意不意外?
原碼反碼符號位,討論這些垃圾幹嘛?
這些垃圾,都是用來騙吃騙喝的!
⑻ 怎麼求一個負數的原碼和補碼
正數,本身就是補碼。
負數,就用它的正數,減一取反,即可得到補碼。
如:+9 的二進制是:0000 1001。
下面求-9 補碼:
先減一:0000 1001 - 1 = 0000 1000;
再取反:1111 0111。
所以有:-9 補碼 = 1111 0111。
這不就完了嗎!
簡不簡單?意不意外?
原碼反碼符號位,討論這些垃圾幹嘛?
這些垃圾,只是那些專家用來騙吃騙喝的!
⑼ C語言中 負數在內存中為什麼要以補碼形式存儲
c的char數據屬於基本類型,基本類型其中還包括-整型,實型,枚舉類型!
數據在內存中是以二進制形式存放的。數值是以補碼表示的。
整型:
一個正數的補碼和其原碼的形式相同。而負數的補碼方式是將其絕對值的二進制形式「按位求反再加1」
實型:
在內存中佔4個位元組,是按照指數形式存儲的,實型數據分為小數部分和指數部分,分別存放!計算機用二進製表示小數部分,用2的冪次來表示指數部分!
字元型:
在內存中字元的存儲實際上是把字元相對應的ASCII代碼放到存儲單元中的。而這些ASCII代碼值在計算機中也是以二進制形式存放的。這個與整型的存儲很相似。因此這兩類之間的轉換也比較方便!
⑽ C語言之負數的補碼
對於有符號數(分正負的),的最高位是符號位
65的二進制是 0 1000001
補碼運算為按位取反 再加1
按位取反:1 0111110
加1: 1 0111111
直接轉換為十進制的話,你把它當成無符號數把1也算了,所以不是-65
從 10111111到-65:
計算機根據符號位為1判斷是負數
按位取反:01000000
加1: 01000001
這就是65,然後是負數,就是-65