【C語言】原碼、反碼、補碼詳解 -《碼上有道 ! 》

目錄

  • 原碼、反碼、補碼詳解及其在C語言中的應用
    • 一、原碼(Sign-Magnitude)
      • 1.1 定義與表示
      • 1.2 歷史來源與作用
      • 1.3 示例
      • 1.4 C語言示例
      • 1.5 代碼運行結果
    • 二、反碼(One's Complement)
      • 2.1 定義與表示
      • 2.2 歷史來源與作用
      • 2.3 示例
      • 2.4 C語言示例
      • 2.5 代碼運行結果
    • 三、補碼(Two's Complement)
      • 3.1 定義與表示
      • 3.2 歷史來源與作用
      • 3.3 示例
      • 3.4 C語言示例
      • 3.5 代碼運行結果
    • 四、原碼、反碼、補碼之間的關系
    • 五、總結
    • 六、參考文獻
    • 七、結束語

原碼、反碼、補碼詳解及其在C語言中的應用

在計算機科學中,整數的表示方式有多種,包括原碼、反碼和補碼。這些表示方式主要用于解決整數的二進制表示和計算問題。本文將詳細介紹這三種表示方法,并通過示例來說明它們的原理和應用,特別是它們在C語言中的應用。

一、原碼(Sign-Magnitude)

1.1 定義與表示

原碼是一種最直接的二進制表示法,其中最高位(最左邊的一位)表示符號位,其他位表示數值大小。

  • 符號位:0 表示正數,1 表示負數。
  • 數值位:直接使用二進制表示數值大小。

1.2 歷史來源與作用

原碼在早期計算機中被廣泛使用,因為其簡單直觀的表示方式便于理解和實現。然而,由于在處理正負數運算時需要單獨處理符號位,導致計算復雜,逐漸被反碼和補碼取代。

1.3 示例

十進制原碼表示
50000 0101
-51000 0101

說明

  • 0000 0101 表示正數 5。
  • 1000 0101 表示負數 -5。

1.4 C語言示例

在C語言中,沒有直接操作原碼的方式,但可以通過位操作實現對符號位和數值位的處理。

#include <stdio.h>void printBinary(int num) {for (int i = 7; i >= 0; i--) {printf("%d", (num >> i) & 1);}printf("\n");
}int main() {int num = 5;int neg_num = -5;printf("原碼表示:\n");printf("5 的二進制表示: ");printBinary(num);printf("-5 的二進制表示: ");printBinary((1 << 7) | num);  // 手動構造原碼表示return 0;
}

1.5 代碼運行結果

原碼表示:
5 的二進制表示: 00000101
-5 的二進制表示: 10000101

二、反碼(One’s Complement)

2.1 定義與表示

反碼是將原碼的數值位按位取反(0 變 1,1 變 0)得到的。

  • 正數的反碼:與其原碼相同。
  • 負數的反碼:將其原碼的數值位取反,符號位不變。

2.2 歷史來源與作用

反碼的引入是為了解決原碼在進行加減運算時的符號位問題。通過按位取反,可以簡化計算機中負數的表示和運算。然而,反碼存在兩個零(正零 0000 0000 和負零 1111 1111),計算不便,最終被補碼取代。

2.3 示例

十進制原碼表示反碼表示
50000 01010000 0101
-51000 01011111 1010

說明

  • 正數 5 的反碼與其原碼相同。
  • 負數 -5 的反碼是 1111 1010,其中 0000 0101 的每個位取反得到 1111 1010

2.4 C語言示例

在C語言中,可以通過位操作計算反碼。

#include <stdio.h>void printBinary(int num) {for (int i = 7; i >= 0; i--) {printf("%d", (num >> i) & 1);}printf("\n");
}int main() {int num = 5;int neg_num = -5;printf("反碼表示:\n");printf("5 的二進制表示: ");printBinary(num);printf("-5 的反碼表示: ");printBinary(~num);  // 按位取反得到反碼return 0;
}

2.5 代碼運行結果

反碼表示:
5 的二進制表示: 00000101
-5 的反碼表示: 11111010

三、補碼(Two’s Complement)

3.1 定義與表示

補碼是目前計算機系統中廣泛使用的一種二進制表示法,解決了原碼和反碼的缺點。

  • 正數的補碼:與其原碼相同。
  • 負數的補碼:在其反碼的基礎上加 1。

3.2 歷史來源與作用

補碼的引入是為了統一零的表示(只有一個零 0000 0000)并簡化計算。補碼使得正數和負數的加減運算可以使用同一套電路,避免了符號位單獨處理的問題,極大地提高了計算效率。由于這些優點,補碼成為現代計算機系統中普遍使用的整數表示方法。

3.3 示例

十進制原碼表示反碼表示補碼表示
50000 01010000 01010000 0101
-51000 01011111 10101111 1011

說明

  • 正數 5 的補碼與其原碼相同。
  • 負數 -5 的補碼是 1111 1011,在反碼 1111 1010 的基礎上加 1 得到 1111 1011

3.4 C語言示例

在C語言中,負數的補碼表示可以通過標準的負數表示方式得到。

#include <stdio.h>void printBinary(int num) {for (int i = 7; i >= 0; i--) {printf("%d", (num >> i) & 1);}printf("\n");
}int main() {int num = 5;int neg_num = -5;printf("補碼表示:\n");printf("5 的二進制表示: ");printBinary(num);printf("-5 的補碼表示: ");printBinary(neg_num);return 0;
}

3.5 代碼運行結果

補碼表示:
5 的二進制表示: 00000101
-5 的補碼表示: 11111011

四、原碼、反碼、補碼之間的關系

十進制原碼反碼補碼
50000 01010000 01010000 0101
-51000 01011111 10101111 1011
  • 正數:原碼、反碼、補碼相同。
  • 負數:反碼是原碼數值位取反,補碼是反碼加 1。

五、總結

表示法特點應用
原碼簡單直觀,計算復雜較少應用
反碼解決符號位問題,存在兩個零較少應用
補碼統一了零的表示,簡化了計算,適合二進制運算現代計算機系統廣泛使用

補碼的優點使得它成為現代計算機系統中普遍使用的整數表示方法。了解原碼、反碼和補碼之間的關系和轉換方法,對于理解計算機底層運算和處理負數具有重要意義。在C語言中,理解這些表示方法有助于更好地處理整數運算和位操作。

六、參考文獻

  1. Kernighan, B. W., & Ritchie, D. M. (1988). The C Programming Language (2nd ed.). Prentice Hall.
  2. Andrew S. Tanenbaum. “Structured Computer Organization.” 6th Edition. Pearson, 2013.
  3. ISO/IEC. (2024). ISO/IEC DIS 9899. Programming Languages – C.
  4. Donald E. Knuth. “The Art of Computer Programming, Volume 2: Seminumerical Algorithms.” 3rd Edition. Addison-Wesley, 1997.

七、結束語

  1. 本節內容已經全部介紹完畢,希望通過這篇文章,大家對原碼、反碼、補碼有了更深入的理解和認識。
  2. 感謝各位的閱讀和支持,如果覺得這篇文章對你有幫助,請不要吝惜你的點贊和評論,這對我們非常重要。再次感謝大家的關注和支持

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/45694.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/45694.shtml
英文地址,請注明出處:http://en.pswp.cn/web/45694.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

sentinel網關限流配置及使用

sentinel控制臺源碼&#xff1a;https://download.csdn.net/download/yixin605691235/89543923 sentinel控制臺jar包&#xff1a;https://download.csdn.net/download/yixin605691235/89543931 不同環境直接修改jar包中的application.yml文件中的nacos地址就可以了。 一、網關限…

【LeetCode 0169】【摩爾投票算法】主元素

Majority Element Given an array nums of size n, return the majority element. The majority element is the element that appears more than ?n / 2? times. You may assume that the majority element always exists in the array. Example 1: **Input:** nums [3…

大數據信用查詢有哪些問題值得注意呢?

隨著大數據技術的不斷發展&#xff0c;大數據信用報告成為一種新型的信用風險檢測工具&#xff0c;被很多的銀行和機構廣泛用于信用風險評估&#xff0c;那大數據信用查詢有哪些問題值得注意呢?本文就帶大家一起去了解一下&#xff0c;希望對你有一定的幫助。 大數據信用查詢這…

JsonCPP源碼分析——分配器和配置器

1、allocator.h文件 該文件定義了一個分配器模版&#xff0c;該文件主要使用了內存對齊控制、rebind機制(C 標準庫的分配器接口要求提供 rebind 機制&#xff0c;以支持不同類型的分配)、::operator new、std::addressof等技術。 內存對齊控制&#xff1a;之所以先保存當前內存…

《C++ 入門:第一個小程序》

《C 入門&#xff1a;第一個小程序》 在學習 C 的旅程中&#xff0c;編寫第一個小程序是一個令人興奮的時刻。它就像打開一扇通往新編程世界的大門&#xff0c;讓我們初步領略 C 的魅力。 C 是一種強大而靈活的編程語言&#xff0c;廣泛應用于各種領域&#xff0c;從系統編程…

python 方向梯度直方圖(HOG)算法 【附兩種實現方法并可視化】

目錄 一、概述1.1 算法定義1.2 實現過程二、方法1(skimage庫)2.1 代碼實現2.2 結果示例三、方法2(cv2庫)3.1 代碼實現3.2 結果示例四、結果對比?? 結果預覽 一、概述 1.1 算法定義 方向梯度直方圖(Histogram of Oriented Gradient,HOG):是應用在計算機視覺和圖像處…

Telegram Bot、小程序開發(三)Mini Apps小程序

文章目錄 一、Telegram Mini Apps小程序二、小程序啟動方式三、小程序開發小程序調試模式初始化小程序Keyboard Button Mini Apps 鍵盤按鈕小程序【依賴具體用戶信息場景,推薦】**Inline Button Mini Apps內聯按鈕小程序**initData 的自動傳遞使用內聯菜單時候哪些參數會默認傳…

LLM微調

文章目錄 一. 常見微調分類1.1 全量微調&#xff08;FFT&#xff1a;Full Fine-tuning&#xff09;1.2 參數高效微調(PEFT&#xff1a;Parameter-Efficient Fine-Tuning)1.3 指令微調&#xff08;IFT&#xff1a;Instructional Fine-tuning&#xff09;1.3.1 Hard prompt1.3.2 …

Docker存儲目錄問題,如何修改Docker默認存儲位置?(Docker存儲路徑、Docker存儲空間)etc/docker/daemon.json

文章目錄 如何更改docker默認存儲路徑&#xff1f;版本1&#xff08;沒測試&#xff09;版本2&#xff08;可行&#xff09;1. 停止 Docker 服務&#xff1a;2. 創建新的存儲目錄&#xff1a;3. 修改 Docker 配置文件&#xff1a;4. 移動現有的 Docker 數據&#xff1a;5. 重新…

Java-svg格式的oss圖片鏈接轉換為png格式圖片字節流

一、引入依賴 <!--svg轉其他格式依賴--> <dependency><groupId>org.apache.xmlgraphics</groupId><artifactId>batik-transcoder</artifactId><version>1.14</version> </dependency> <dependency><groupId&g…

什么樣的服務器是合乎直銷網站標準

現在社會的發展,有著越來越多的人想要利用互聯網來做直銷。做好直銷行業系統解決方案離不開好的服務器支持,服務器的的穩定性和速度是直接影響網站后期運作,可以看做是網站的根基。 做網站直銷選擇租用服務器需要注意的幾點要素 一些大的直銷互聯網公司如安利、雅芳、康寶萊、玫…

【人工智能】自然語言處理(NLP)的突破,關注NLP在機器翻譯、情感分析、聊天機器人等方面的最新研究成果和應用案例。

自然語言處理&#xff08;NLP&#xff09;作為人工智能的一個重要分支&#xff0c;近年來取得了顯著的突破&#xff0c;特別在機器翻譯、情感分析、聊天機器人等領域取得了顯著的研究成果和廣泛的應用。以下是對這些領域最新研究成果和應用案例的概述&#xff0c;并附帶相應的代…

域名解析記錄與服務器源IP的探索

在互聯網中&#xff0c;域名和IP地址是進行網絡通信的基礎。用戶通常通過域名來訪問網站或服務&#xff0c;而實際的數據交換則發生在IP地址之間。域名解析&#xff08;DNS解析&#xff09;是將易于記憶的域名轉換為計算機可識別的IP地址的過程。本文將探討如何通過域名解析記錄…

Uniapp自定義動態加載組件(2024.7更新)

1.本次介紹如何使用uniapp實現自定義動態加載Loading的組件&#xff0c;可以gif格式&#xff0c;也可以mp4格式等; 編寫自定義Loading組件(CustomLoader.vue)&#xff1b;組件中含有“動態接收圖片路徑”&#xff0c;“10秒超時未false則自動斷開關閉Loading”&#xff1b;在全…

【JavaScript 算法】廣度優先搜索:層層推進的搜索策略

&#x1f525; 個人主頁&#xff1a;空白詩 文章目錄 一、算法原理二、算法實現三、應用場景四、優化與擴展五、總結 廣度優先搜索&#xff08;Breadth-First Search, BFS&#xff09;是一種用于遍歷或搜索圖或樹數據結構的算法。該算法從起始節點開始&#xff0c;逐層向外擴展…

小程序-2(WXML數據模板+WXSS模板樣式+網絡數據請求)

目錄 1.WXML數據模板 數據綁定 事件綁定 小程序中常用的事件 事件對象的屬性列表 target和currentTarget的區別 bindtap的語法格式 在事件處理事件中為data中的數據賦值 事件傳參與數據同步 事件傳參 bindinput的語法綁定事件 文本框和data的數據同步 條件渲染 w…

《向量數據庫指南》——使用 Grafana 和 Loki 搭建 Milvus Cloud日志查詢系統

本教程將介紹如何設置 Grafana 和 Loki 來有效監控您的 Milvus Cloud實例。 Milvus Cloud是一款分布式向量數據庫,可高效存儲、索引和管理萬億級 Embedding 向量,是搭建 AI 和 ML 應用的首選向量數據庫系統。 Grafana 是一個開源的指標監控平臺,提供可視化的指標和日志…

5,SSH 端口轉發

SSH 端口轉發 簡介 SSH 除了登錄服務器&#xff0c;還有一大用途&#xff0c;就是作為加密通信的中介&#xff0c;充當兩臺服務器之間的通信加密跳板&#xff0c;使得原本不加密的通信變成加密通信。這個功能稱為端口轉發&#xff08;port forwarding&#xff09;&#xff0c…

SpringCloud | 單體商城項目拆分(微服務)

為什么要進行微服務拆分&#xff1f; 在平常的商城項目中&#xff0c;我們一般的項目結構模塊都是將各種業務放在同一個項目文件夾&#xff0c;比如像&#xff1a; 用戶&#xff0c;購物車&#xff0c;商品&#xff0c;訂單&#xff0c;支付等業務都是放在一起&#xff0c;這樣…

thinkphp:數據庫多條件查詢

一、使用if條件限制查詢條件 $query Db::table(wip_operation_plan)->alias(d)->join([wip_jobs_all > a], a.wip_entity_name d.wip_entity_name)->join([sf_item_no > c], a.primary_itemc.item_no)->field(d.*,c.item_no as item_no,c.item_name as i…