国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

List 3.5 詳解原碼、反碼、補碼

這篇具有很好參考價值的文章主要介紹了List 3.5 詳解原碼、反碼、補碼。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

?前言

本博客文章已收錄至我的Java SE專欄,如需閱讀其他有關博客筆記請轉至該專欄下

傳送門 -->Java SE_程序員雨空集


目錄

?前言

原碼

原碼的示例

原碼的弊端

反碼

反碼的示例

反碼的弊端

補碼

補碼的示例

補碼的小細節(jié)

總結


原碼

原碼:十進制數(shù)據的二進制表現(xiàn)形式,最左邊是符號位,0為正,1為負

利用原碼對正數(shù)進行計算是不會有問題的。

十進制是逢十進一,不會出現(xiàn)10這個數(shù)字。

二進制是逢二進一,不會出現(xiàn)2這個數(shù)字。


原碼的示例

比如十進制56轉成二進制就是00111000。

00111000中,最左邊的0就是代表這個數(shù)為正數(shù),其余的0111000代表56,也就是下面這個樣子。

List 3.5 詳解原碼、反碼、補碼,Java SE,java,c++,學習,筆記,python

其中,一個0或者一個1就代碼1bit(中文翻譯叫比特位)。

計算機里是通常是把8個bit分為一組,叫做一個byte(字節(jié)),而字節(jié)是計算機中最小的存儲單元。

而一個字節(jié)最大值表示為01111111,轉化成十進制就是+127,是正的127。

最左邊的符號位取0,其余位為數(shù)據,因為是求最大,每位上全部取最大為1。

而一個字節(jié)最小值表示為11111111,轉化成十進制就是-127,是負的127。

最左邊的符號位取1,其余位為數(shù)據,因為是求最小,每位上全部取最小也為1 。


原碼的弊端

又舉個例子

現(xiàn)在有一個字節(jié)代表的數(shù)是-0,也就是0,如下圖

List 3.5 詳解原碼、反碼、補碼,Java SE,java,c++,學習,筆記,python

如果我現(xiàn)在要對它進行+1操作,也就是下面這樣

List 3.5 詳解原碼、反碼、補碼,Java SE,java,c++,學習,筆記,python

按理說0+1=(+1),但是根據上圖,這樣做的話就粗問題了,按照二進制的規(guī)則,這樣操作的二進制轉成十進制為-1,也就是下圖才是我們想要的結果

List 3.5 詳解原碼、反碼、補碼,Java SE,java,c++,學習,筆記,python

如果在此實際值上再進行+1操作,又出現(xiàn)了下面的情況

List 3.5 詳解原碼、反碼、補碼,Java SE,java,c++,學習,筆記,python

為什么會出現(xiàn)這樣的情況呢?

List 3.5 詳解原碼、反碼、補碼,Java SE,java,c++,學習,筆記,python

想要理解清楚,需要結合數(shù)軸去理解

如果我要用二進制表示0的基礎上+1,但是因為符號位是1代表負數(shù),實際是在0的位置上往負的方向前進的1單位,如下圖所示

List 3.5 詳解原碼、反碼、補碼,Java SE,java,c++,學習,筆記,python

所以這就是原碼的弊端:在原碼的基礎上,如果是負數(shù)計算,結果就出錯,實際運算的結果,跟我們預期的結果是相反的。

List 3.5 詳解原碼、反碼、補碼,Java SE,java,c++,學習,筆記,python

如果我們結合上面的數(shù)軸,在進行負數(shù)計算的時候,如果把數(shù)軸的方向倒轉一下,那不就得到了我們想要的結果了嗎?因此,這就引出了反碼的由來


反碼

反碼:為了解決原碼不能計算負數(shù)的問題而出現(xiàn)的

計算規(guī)則:

  • 正數(shù)的反碼不變。
  • 負數(shù)的反碼在原碼的基礎上,符號位不變。數(shù)值取反,0變1,1變0。

為什么正數(shù)的反碼不變?

  • 因為正數(shù)之間的計算是沒有任何問題,只有我們上面舉到的例子中有負數(shù)的計算才會有反碼的出現(xiàn)

反碼的示例

又又舉個栗子

十進制-56的二進制原碼是10111000。根據規(guī)則,符號位不變。數(shù)值取反,0變1,1變0。它的反碼為11000111

驗證反碼能不能解決原碼負數(shù)計算的問題,我們可以驗證一下

就看看-56+1的值是不是為-55的這個情況?

  • -56的原碼是10111000,而-56的反碼就是11000111。
  • 進行-56+1的操作就是在-56的反碼11000111從最右邊的數(shù)字進1位根據二進制逢二進一變?yōu)?1001000
  • 而55的原碼是0011011,所以-55的原碼就是1011011,所以-55的反碼就是1100100,結果成立!

List 3.5 詳解原碼、反碼、補碼,Java SE,java,c++,學習,筆記,python

這么一來,你就懂了吧?如果還沒明白,把上面的步驟多看幾遍,你就懂了


反碼的弊端

又又又舉個例子,我現(xiàn)在

現(xiàn)在又一個十進制數(shù)字-2,其原碼是1000 0010,其反碼為1111 1101

  • 如果對-2進行+1操作之后,其原碼變?yōu)?000 0001,反碼變?yōu)?111 1110,結果為-2+1=-1,沒問題
  • 如果對-2進行+2操作,也就是兩次+1操作,原碼會變成1000 0000 ,反碼變?yōu)?111 1111,結果為-2+2=0 也沒問題
  • 如果對-2進行+3進行操作,也就是三次+1錯做,原碼會變成0000 0000,反碼變成0000 0000,結果為-2+3=0,到這里就不對起來了?

為什么會出現(xiàn)這樣的情況呢?

List 3.5 詳解原碼、反碼、補碼,Java SE,java,c++,學習,筆記,python

就是因為二進制對于0的表達有兩種方式,如下圖表格所示

十進制數(shù)

原碼

反碼

+0

0000 0000

0000 0000

-0

1000 0000

1111 1111

-1

1000 0001

1111 1110

-2

1000 0010

1111 1101

怎么解決呢?這就引出了補碼的由來

當初的哪些計算機大佬是那么想的:既然反碼計算到0的時候會因為有2個0的表達方式而造成計算誤差,那我把反碼中的兩個0的表達方式屏蔽一個不就好了嘛。所以就有了補碼的出現(xiàn)

List 3.5 詳解原碼、反碼、補碼,Java SE,java,c++,學習,筆記,python

十進制數(shù)

原碼

反碼

補碼

+0

0000 0000

0000 0000

0000 0000

-0

1000 0000

1111 1111

0000 0000

-1

1000 0001

1111 1110

1111 1111

-2

1000 0010

1111 1101

1111 1110

這樣就可以把0的兩種表現(xiàn)形式給屏蔽掉了,但是這里的補碼是為了有負數(shù)、有反碼的計算。

如果全部是正數(shù)的計算就用原碼計算即可


補碼

補碼:為了解決反碼不能計算負數(shù)超過0的問題而出現(xiàn)的

補碼的示例

先把上面的表拿下來

十進制數(shù)

原碼

反碼

補碼

+0

0000 0000

0000 0000

0000 0000

-0

1000 0000

1111 1111

0000 0000

-1

1000 0001

1111 1110

1111 1111

-2

1000 0010

1111 1101

1111 1110

-3

1000 0011

1111 1100

1111 1101

-4

1000 0100

1111 1011

1111 1100

舉例一個跨0的情況,進行-4+5的操作

  • -4的補碼是1111 1100
  • 5是一個正數(shù)。正數(shù)的原碼、反碼、補碼的值都是一樣的,所以補碼為0000 0101
  • 把兩者補碼進行相加操作,得到補碼0000 0001,表示十進制的數(shù)就是1,成功!

List 3.5 詳解原碼、反碼、補碼,Java SE,java,c++,學習,筆記,python

這么一來,你就懂了吧?如果還沒明白,把上面的步驟多看幾遍,你就懂了


補碼的小細節(jié)

因為補碼是在反碼的基礎上+1得到的,所以-127的補碼就是1000 0001,所以就會空出一位,因為+0和-0的補碼是相同的,就會節(jié)省出一個補碼跑到最下面,如下圖所示

十進制數(shù)

原碼

反碼

補碼

+0

0000 0000

0000 0000

0000 0000

-0

1000 0000

1111 1111

0000 0000

-1

1000 0001

1111 1110

1111 1111

-2

1000 0010

1111 1101

1111 1110

-3

1000 0011

1111 1100

1111 1101

-4

1000 0100

1111 1011

1111 1100

......

......

......

......

-126

1111 1110

1000 0001

1000 0010

-127

1111 1111

1000 0000

1000 0001

-128

1000 0000

因為補碼的這個特性,-128是特殊規(guī)定的,因此沒有原碼和反碼。但是這也不影響,因為計算機中數(shù)字的存儲和運算都是以補碼為基礎進行的


總結

原碼是用來表示十進制數(shù)據的一種二進制形式,最左邊的一位是符號位,0表示正數(shù),1表示負數(shù)。但是,原碼不能直接用于負數(shù)計算,如果用原碼進行負數(shù)計算,結果會出錯,實際運算的方向與正確運算的方向相反。


反碼是為了解決原碼不能計算負數(shù)的問題而出現(xiàn)的。對于正數(shù),反碼和原碼一樣;對于負數(shù),反碼是在原碼的基礎上將符號位不變,數(shù)值位全部取反(即0變1,1變0)。然而,反碼也存在一個問題,那就是如果負數(shù)的計算結果跨過0,那么結果會比實際結果多1。


補碼則是為了解決反碼不能計算負數(shù)超過0的問題而出現(xiàn)的。對于正數(shù),補碼和原碼、反碼一樣;對于負數(shù),補碼是在反碼的基礎上加1。這樣,負數(shù)就可以正確地用補碼表示了。此外,補碼還可以多記錄一個特殊的值-128,這在用一個字節(jié)表示數(shù)據的情況下是特別重要的。文章來源地址http://www.zghlxwxcb.cn/news/detail-718175.html

到了這里,關于List 3.5 詳解原碼、反碼、補碼的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 什么是原碼、反碼和補碼

    什么是原碼、反碼和補碼

    前言 一個數(shù)在計算機中的表示形式是二進制的話,這個數(shù)其實就叫機器數(shù)。 機器數(shù)通常是帶有符號的(指有正數(shù)和負數(shù)之分),計算機用最高位存放符號,這個 bit 一般叫做符號位。 正數(shù)的符號位為 0, 負數(shù)的符號位為 1。比如,十進制中的數(shù) +7 ,計算機字長為8位,轉換成

    2023年04月09日
    瀏覽(18)
  • 原碼、補碼、反碼的關系及應用場景

    是三種表示有符號整數(shù)的方法,它們之間存在一定的關系。 原碼 是最基本的表示方法,即將一個數(shù)的符號位和數(shù)值位分開表示,符號位用0表示正數(shù),用1表示負數(shù)。例如,+7的原碼為00000111,-7的原碼為10000111。 反碼 是在原碼的基礎上,將負數(shù)的數(shù)值位按位取反得到的表示方

    2024年02月06日
    瀏覽(22)
  • C++知識精講13 | 原碼、反碼和補碼

    ------------------------------------------------------------------------------------------------------------------------- 觀看視頻ing......? 12歲的少年編程者告訴你編程如此簡單 ?------------------------------------------------------------------------------------------------------------------------- ---------------------------------------

    2024年02月16日
    瀏覽(16)
  • 【007】C++數(shù)據類型之原碼、補碼、反碼

    【007】C++數(shù)據類型之原碼、補碼、反碼

    ?? 作者簡介:專注于C/C++高性能程序設計和開發(fā),理論與代碼實踐結合,讓世界沒有難學的技術。包括C/C++、Linux、MySQL、Redis、TCP/IP、協(xié)程、網絡編程等。 ?? ??? CSDN實力新星,社區(qū)專家博主 ?? ?? 專欄介紹:從零到c++精通的學習之路。內容包括C++基礎編程、中級編程、

    2024年02月05日
    瀏覽(32)
  • 補碼的反碼加1為什么是原碼?

    搞了半個小時,終于弄懂了。 16 8 4 2 1 原碼 1 0 0 1 1 反碼 0 1 1 0 0 補碼 0 1 1 0 1 學到這里了,我們肯定知道,原碼+補碼 = 0,在這里也就是 = 19 + 13 = 32,溢出來的一位正好舍去了; 所以說,對啊,只要保證原碼+補碼 = 32(以此類推)不就好了嗎! 所以,補碼是 通過原碼 這樣得

    2024年02月10日
    瀏覽(21)
  • 位運算(按位與、按位或、異或、取反)以及原碼、反碼、補碼

    位運算(按位與、按位或、異或、取反)以及原碼、反碼、補碼

    目錄 位運算 按位與運算符 [ ] 按位或運算符 [ | ] 異或運算符 [ ^ ] 取反運算符 [ ~ ] 移位操作 一些面試??嫉奈徊僮鬟\算 獲取二進制中最右邊的1 計算機原碼、反碼、補碼 機器數(shù) “三碼”之間的轉換 計算機中為啥要用補碼呢? 真數(shù) 原碼 反碼 補碼 有了原碼為什么要使用反碼

    2024年02月02日
    瀏覽(17)
  • 【C語言】中的位操作符和移位操作符,原碼反碼補碼以及進制之間的轉換

    【C語言】中的位操作符和移位操作符,原碼反碼補碼以及進制之間的轉換

    歡迎大家來到c語言知識小課堂,今天的知識點是操作符和進制 同樣都是數(shù)字1111,不同進制下數(shù)字的大小不同,第二行代表的是其各位數(shù)字十進制下的大小,將各位數(shù)字的十進制大小相加即1111在這個進制下轉化為十進制的大小,從圖中我們可以看出來 進制的定義:從右往左

    2024年02月22日
    瀏覽(24)
  • 愛上C語言:整型和浮點型在內存中的存儲(進制轉換,原碼,反碼,補碼以及大小端)

    愛上C語言:整型和浮點型在內存中的存儲(進制轉換,原碼,反碼,補碼以及大小端)

    ?? 作者:阿輝不一般 ?? 你說呢: 生活本來沉悶,但跑起來就有風 ?? 專欄:愛上C語言 ?? 作圖工具:draw.io ( 免費開源的作圖網站) 如果覺得文章對你有幫助的話,還請點贊,關注,收藏支持博主,如有不足還請指點,博主及時改正,感謝大家支持?。?! 大家好啊??!今

    2024年02月05日
    瀏覽(24)
  • 關于二進制的原碼、補碼和反碼,以及表示范圍、常見位運算符和進制轉換的理解與簡述

    關于二進制的原碼、補碼和反碼,以及表示范圍、常見位運算符和進制轉換的理解與簡述

    【版權聲明】未經博主同意,謝絕轉載?。ㄕ堊鹬卦瓌?chuàng),博主保留追究權) https://www.cnblogs.com/cnb-yuchen/p/17963363 出自【進步*于辰的博客】 參考筆記一,P3.13、P5.1;筆記三,P43.1/3、P44.1。 注:我暫且沒有整理關于二進制、原碼、補碼和反碼等概念的理論,本文中的闡述都基于

    2024年02月02日
    瀏覽(25)
  • 【C語言趣味教程】(2) 整數(shù)類型 | 數(shù)據類型的概念 | 原碼反碼與補碼 | 有符號型和無符類型 | 研究 signed char 與 unsigned char 的取值范圍

    【C語言趣味教程】(2) 整數(shù)類型 | 數(shù)據類型的概念 | 原碼反碼與補碼 | 有符號型和無符類型 | 研究 signed char 與 unsigned char 的取值范圍

    ? ???《C語言趣味教程》??? 猛戳訂閱!?。?在講解數(shù)據類型前,我們不得不先講解一些必備的知識點,比如如何定義一個變量,數(shù)據類型的基本概念。并介紹 ASCII 碼,為 char 類型的講解做必要的鋪墊。然后講解原碼反碼和補碼,講解 IEEE754標準時需要這部分的知識作為基

    2024年02月15日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包