国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

有符號數和無符號數負數

2019-11-08 18:35:05
字體:
來源:轉載
供稿:網友
理解有符號數和無符號數負數在計算機中如何表示呢? 這一點,你可能聽過兩種不同的回答。 一種是教科書,它會告訴你:計算機用“補碼”表示負數。可是有關“補碼”的概念一說就得一節課,這一些我們需要在第6章中用一章的篇幅講2進制的一切。再者,用“補碼”表示負數,其實一種公式,公式的作用在于告訴你,想得問題的答案,應該如何計算。卻并沒有告訴你為什么用這個公式就可以和答案? 另一種是一些程序員告訴你的:用二進制數的最高位表示符號,最高位是0,表示正數,最高位是1,表示負數。這種說法本身沒錯,可是如果沒有下文,那么它就是錯的。至少它不能解釋,為什么字符類型的-1用二進制表示是“1111 1111”(16進制為FF);而不是我們更能理解的“1000 0001”。(為什么說后者更好理解呢?因為既然說最高位是1時表示負數,那1000 0001不是正好是-1嗎?)。 讓我們從頭說起。 1、你自已決定是否需要有正負就像我們必須決定某個量使用整數還是實數,使用多大的范圍數一樣,我們必須自已決定某個量是否需要正負。如果這個量不會有負值,那么我們可以定它為帶正負的類型。 在計算機中,可以區分正負的類型,稱為有符號類型,無正負的類型(只有正值),稱為無符號類型。 數值類型分為整型或實型,其中整型又分為無符類型或有符類型,而實型則只有符類型。 字符類型也分為有符和無符類型。 比如有兩個量,年齡和庫存,我們可以定前者為無符的字符類型,后者定為有符的整數類型。 2、使用二制數中的最高位表示正負 首先得知道最高位是哪一位?1個字節的類型,如字符類型,最高位是第7位,2個字節的數,最高位是第15位,4個字節的數,最高位是第31位。不同長度的數值類型,其最高位也就不同,但總是最左邊的那位(如下示意)。字符類型固定是1個字節,所以最高位總是第7位。 單字節數: 1111 1111 雙字節數: 1111 1111 1111 1111 四字節數: 1111 1111 1111 1111 1111 1111 1111 1111   當我們指定一個數量是無符號類型時,那么其最高位的1或0,和其它位一樣,用來表示該數的大小。 當我們指定一個數量是有符號類型時,此時,最高數稱為“符號位”。為1時,表示該數為負值,為0時表示為正值。   3、無符號數和有符號數的范圍區別無符號數中,所有的位都用于直接表示該值的大小。有符號數中最高位用于表示正負,所以,當為正值時,該數的最大值就會變小。我們舉一個字節的數值對比: 無符號數: 1111 1111    值:255 1* 2^7 + 1* 2^6 + 1* 2^5 + 1* 2^4 + 1* 2^3 + 1* 2^2 + 1* 2^1 + 1* 2^0 有符號數: 0111 1111    值:127                 1* 2^6 + 1* 2^5 + 1* 2^4 + 1* 2^3 + 1* 2^2 + 1* 2^1 + 1* 2^0   同樣是一個字節,無符號數的最大值是255,而有符號數的最大值是127。原因是有符號數中的最高位被挪去表示符號了。并且,我們知道,最高位的權值也是最高的(對于1字節數來說是2的7次方=128),所以僅僅少于一位,最大值一下子減半。 不過,有符號數的長處是它可以表示負數。因此,雖然它的在最大值縮水了,卻在負值的方向出現了伸展。我們仍一個字節的數值對比: 無符號數:                             0 ---------- 255 有符號數:         -128 --------- 0 ---------- 127   同樣是一個字節,無符號的最小值是 0 ,而有符號數的最小值是-128。所以二者能表達的不同的數值的個數都一樣是256個。只不過前者表達的是0到255這256個數,后者表達的是-128到+127這256個數。 一個有符號的數據類型的最小值是如何計算出來的呢? 有符號的數據類型的最大值的計算方法完全和無符號一樣,只不過它少了一個最高位(見第3點)。但在負值范圍內,數值的計算方法不能直接使用1* 26 + 1* 25 的公式進行轉換。在計算機中,負數除為最高位為1以外,還采用補碼形式進行表達。所以在計算其值前,需要對補碼進行還原。這里,先直觀地看一眼補碼的形式: 以我們原有的數學經驗,在10進制中:1 表示正1,而加上負號:-1 表示和1相對的負值。 那么,我們會很容易認為在2進制中(1個字節): 0000 0001 表示正1,則高位為1后:1000 0001應該表示-1。 然而,事實上計算機中的規定有些相反,請看下表: 二進制值(單字節) 十進制值 1000 0000                  -128 1000 0001                  -127 1000 0010                  -126 1000 0011                  -125 ... ... 1111 1110                   -2 1111 1111                   -1 首先我們看到,從-1到-128,其二進制的最高位都是1,正如我們前面的學。 然后我們有些奇怪地發現,1000 0000 并沒有拿來表示 -0;而1000 0001也不是拿來直觀地表示-1。事實上,-1 用1111 1111來表示。 怎么理解這個問題呢?先得問一句是-1大還是-128大? 當然是 -1 大。-1是最大的負整數。以此對應,計算機中無論是字符類型,或者是整數類型,也無論這個整數是幾個字節。它都用全1來表示 -1。比如一個字節的數值中:1111 1111表示-1,那么,1111 1111 - 1 是什么呢?和現實中的計算結果完全一致。1111 1111 - 1 = 1111 1110,而1111 1110就是-2。這樣一直減下去,當減到只剩最高位用于表示符號的1以外,其它低位全為0時,就是最小的負值了,在一字節中,最小的負值是1000 0000,也就是-128。我們以-1為例,來看看不同字節數的整數中,如何表達-1這個數: 字節數 二進制值                                                                   十進制值 單字節數 1111 1111                                                               -1 雙字節數 1111 1111 1111 1111                                             -1 四字節數 1111 1111 1111 1111 1111 1111 1111 1111         -1   可能有同學這時會混了:為什么 1111 1111 有時表示255,有時又表示-1?所以我再強調一下本節前面所說的第2點:你自已決定一個數是有符號還是無符號的。寫程序時,指定一個量是有符號的,那么當這個量的二進制各位上都是1時,它表示的數就是-1;相反,如果事選聲明這個量是無符號的,此時它表示的就是該量允許的最大值,對于一個字節的數來說,最大值就是255。 另外:128 =1000 0000,8位機器[-128]原碼 = 1000 0000 發生了溢出,最高位表示符號位:0為正數,1為負數 [-128]反碼 = 1111 1111 除符號位外,各位取反 [-128]補碼 = 1000 0000 反碼的末位加1,不能影響符號位
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 唐河县| 天水市| 南江县| 榆社县| 珠海市| 武邑县| 红原县| 绥德县| 兴和县| 仲巴县| 麻江县| 马公市| 政和县| 如东县| 六盘水市| 皮山县| 江川县| 长乐市| 濮阳市| 通河县| 宽城| 马尔康县| 青岛市| 平罗县| 包头市| 永州市| 顺义区| 安仁县| 全州县| 莒南县| 渝北区| 米脂县| 酒泉市| 漳平市| 双城市| 小金县| 绥德县| 哈尔滨市| 宝鸡市| 油尖旺区| 澳门|