數據在內存中存儲(C語言)

文章目錄

    • 前言
    • 一、整數在內存中的存儲
      • 1.1 計算機存儲數據的基本單位
        • 示例代碼
      • 1.2 無符號整數的存儲
      • 1.3 有符號整數的存儲(補碼)
        • 示例代碼
    • 二、大小端字節序和字節序判斷
      • 2.1 什么是大小端?
        • 示例代碼
      • 2.2 為什么會有大小端?
      • 2.3 字節序的判斷
    • 三、浮點數在內存中的存儲
      • 3.1 IEEE 754 浮點數表示法
        • 示例代碼(單精度浮點數)
      • 3.2 浮點數存儲結構
      • 3.3 浮點數的存儲和讀取過程
        • 存儲過程:
        • 讀取過程:
    • 總結

前言

在計算機的世界里,所有數據最終都要存儲到內存中,而內存是以 字節(Byte) 為單位進行存儲的。不同類型的數據在內存中的存儲方式可能不一樣,甚至可能會涉及字節順序(大小端)。理解這些存儲原理不僅能幫助我們掌握計算機底層原理,還能提高編程和調試能力。

本文將帶你從 整數大小端浮點數 三個方面,深入淺出地介紹數據在內存中的存儲方式,并通過詳細的示例代碼加以說明。
在這里插入圖片描述


一、整數在內存中的存儲

整數(如 int 類型)的存儲方式與其 二進制表示 密切相關。下面介紹計算機存儲數據的基本單位,以及無符號整數和有符號整數(使用補碼)的存儲方式。

1.1 計算機存儲數據的基本單位

計算機的存儲是 二進制 的,最小的存儲單位是 位(bit)。每 8 個 bit 組成 1 個字節(Byte)。

例如:

  • 1 bit:取值 01
  • 1 Byte = 8 bits:例如,00000000 表示十進制 000000001 表示十進制 1

計算機通常以 字節(Byte) 為單位存儲數據,而整數通常占用 多個字節

示例代碼
#include <stdio.h>int main() {int num = 5;printf("%d 在內存中的大小: %lu 字節\n", num, sizeof(num));return 0;
}

1.2 無符號整數的存儲

無符號整數(unsigned int)只表示非負數,直接使用二進制表示。例如,假設 unsigned int 類型占 4 個字節(32 位):

十進制數二進制表示(32 位)
500000000 00000000 00000000 00000101
25500000000 00000000 00000000 11111111

可以看到,數值 5 存儲為 00000101(低位在右,高位在左)。

1.3 有符號整數的存儲(補碼)

有符號整數(int)可以表示正數和負數。計算機通常采用 補碼 來表示負數,這樣可以使加減運算統一,并且只有唯一的零表示。

負數的補碼計算過程:

  1. 將數值的絕對值轉換為二進制原碼。
  2. 對原碼每一位取反(0 變 1,1 變 0)。
  3. 最后加 1,得到補碼。
示例代碼
#include <stdio.h>int main() {int num = -5;printf("%d 在內存中的存儲: ", num);unsigned char *p = (unsigned char *)&num;for (int i = 0; i < sizeof(num); i++) {printf("%02X ", p[i]);}printf("\n");return 0;
}

通過該示例,你可以看到 -5 在內存中的存儲(二進制補碼表示)。


二、大小端字節序和字節序判斷

對于多字節數據(如 intfloat),它們在內存中的存儲順序依賴于 CPU 架構,通常分為大端和小端兩種模式。

2.1 什么是大小端?

  • 大端(Big Endian):高位字節存儲在低地址,低位字節存儲在高地址。這種方式符合人類閱讀習慣,從左到右依次遞減。
  • 小端(Little Endian):低位字節存儲在低地址,高位字節存儲在高地址,便于計算機進行加法等運算(從最低有效位開始)。
示例代碼
#include <stdio.h>void print_bytes(int num) {unsigned char *p = (unsigned char *)&num;for (int i = 0; i < sizeof(num); i++) {printf("%02X ", p[i]);}printf("\n");
}int main() {int num = 0x12345678;printf("內存中的存儲順序: ");print_bytes(num);return 0;
}

根據你的 CPU 架構,你可能會看到:

  • 大端模式:輸出類似 12 34 56 78
  • 小端模式:輸出類似 78 56 34 12

2.2 為什么會有大小端?

大小端的區別主要來源于計算機體系結構的不同:

  • 大端模式:最早由 IBM 等體系架構采用,數據按人類閱讀習慣存儲(高位在前)。
  • 小端模式:主要由 Intel 體系架構采用,便于在進行算術運算時從低位開始處理數據,簡化了硬件設計。

2.3 字節序的判斷

可以通過一個簡單的 C 語言程序來判斷當前系統的字節序:

#include <stdio.h>int main() {int num = 1;if (*(char *)&num == 1) {printf("小端模式\n");} else {printf("大端模式\n");}return 0;
}

如果輸出 “小端模式”,說明低位字節存儲在低地址。


三、浮點數在內存中的存儲

浮點數的存儲采用 IEEE 754 標準,將浮點數拆分為符號位、指數位和尾數位。下面詳細介紹 IEEE 754 浮點數表示法、存儲結構以及存儲和讀取過程。

3.1 IEEE 754 浮點數表示法

IEEE 754 是國際通用的浮點數存儲標準,主要分為兩種格式:

  • 單精度浮點數(32 位)

    • 符號位(S):1 位,表示正負(0 表示正數,1 表示負數)。
    • 指數位(E):8 位,采用移碼表示(偏移量為 127)。
    • 尾數位(M):23 位,存儲有效數字,默認存在隱含的 1
  • 雙精度浮點數(64 位)

    • 符號位(S):1 位
    • 指數位(E):11 位,偏移量為 1023。
    • 尾數位(M):52 位
示例代碼(單精度浮點數)
#include <stdio.h>void print_float(float num) {unsigned char *p = (unsigned char *)&num;for (int i = 0; i < sizeof(num); i++) {printf("%02X ", p[i]);}printf("\n");
}int main() {float num = 3.14f;printf("3.14 在內存中的存儲: ");print_float(num);return 0;
}

通過該示例,你可以看到 3.14 在內存中的字節序列,理解其 IEEE 754 格式的表示。

3.2 浮點數存儲結構

以單精度浮點數為例,存儲過程大致如下:

  1. 轉換為二進制:將十進制數(例如 3.14)轉換為二進制表示。
    例如 3.14 的二進制近似表示為 11.001001...

  2. 標準化:將二進制數調整為 1.xxxxx 的形式,同時記錄指數。
    對于 3.14,標準化表示為 1.1001001... × 2^1

  3. 計算指數:將標準化指數加上偏移量(單精度偏移量為 127),得到最終的指數部分。
    對于上例:指數 1 + 127 = 128,其二進制表示為 10000000

  4. 處理尾數:舍去標準化表示中的隱含的 1,保留后面的有效位作為尾數。
    例如:尾數為 1001001...,填充到 23 位。

  5. 符號位:根據正負確定符號位(正數為 0,負數為 1)。

最終,3.14 會按照上述結構存儲為 4 字節(32 位)的二進制數據。

3.3 浮點數的存儲和讀取過程

存儲過程:
  1. 將十進制浮點數轉換為二進制表示;
  2. 標準化成 1.xxx 的格式;
  3. 計算指數并加上偏移量;
  4. 提取尾數并構造 IEEE 754 格式;
  5. 將符號位、指數位和尾數位組合成最終的存儲格式。
讀取過程:
  1. 從內存中讀取浮點數的 4 字節數據;
  2. 分析并提取符號位、指數位和尾數位;
  3. 將指數位減去偏移量(127)得到實際指數;
  4. 還原尾數(在前面補上默認的隱含 1);
  5. 根據符號位決定正負,最終還原為十進制浮點數。

總結

本文詳細介紹了數據在內存中的存儲方式,重點涵蓋了:

  • 整數存儲:理解無符號整數直接存儲和有符號整數使用補碼存儲的原理。
  • 大小端字節序:了解大端與小端的概念、產生原因及判斷方法。
  • 浮點數存儲:通過 IEEE 754 標準,了解浮點數的符號位、指數位和尾數位的表示方法,以及存儲與讀取過程。

掌握這些知識,將幫助你更深入地理解計算機底層原理,并在調試和系統編程中更加得心應手。希望這篇博客能為你的學習提供實用的參考!

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

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

相關文章

Python爬蟲第2節-網頁基礎和爬蟲基本原理

目錄 一、網頁基礎 1.1 網頁的組成 1.2 網頁的結構 1.3 節點樹及節點間的關系 1.4 選擇器 二、爬蟲的基本原理 2.1 爬蟲概述 2.2 能抓怎樣的數據 2.3 JavaScript 渲染頁面 一、網頁基礎 使用瀏覽器訪問網站時&#xff0c;我們會看到各式各樣的頁面。你是否思考過&…

python-leetcode 64.在排序數組中查找元素的第一個和最后一個位置

題目&#xff1a; 給一個按照非遞減順序排列的整數數組nums,和一個目標值target,請找出給定目標值在數組中的開始位置和結束位置。 如果數組中不存在目標值target,返回[-1,-1] 方法一&#xff1a;二分查找 直觀的思路肯定是從前往后遍歷一遍。用兩個變量記錄第一次和最后一次…

分享一些新版GPT-4o使用方式!能多模態生圖!

目前GPT-4o的整體測評&#xff0c;真的很驚艷。 不知道又有多少人因為OpenAI的這次更新而失業&#xff0c;當然只要AI用得好&#xff0c;會有更多人因之而受益&#xff01;很多人表示不知道怎么用&#xff0c;對于門外漢來說&#xff0c;4o似乎有點高端。 今天就給大家介紹幾…

軟件工程面試題(二十四)

1、連接池的原理 j2ee 服務器啟動時會建立一定數量的池連接,并一直維持不少于此數量的池連接。當客戶端程序需要連接時,吃驅動程序會返回一個未使用的池連接并將其標記為忙。如果當前 沒有空閑連接,池驅動就建立一定新的 連接 2、用javascript編寫腳本小程序,實現點擊全選…

Android:Dialog的使用詳解

Android中Dialog的使用詳解 Dialog&#xff08;對話框&#xff09;是Android中常用的UI組件&#xff0c;用于臨時顯示重要信息或獲取用戶輸入。 1. 基本Dialog類型 1.1 AlertDialog&#xff08;警告對話框&#xff09; 最常用的對話框類型&#xff0c;可以設置標題、消息、…

arinc818 fpga單色圖像傳輸ip

arinc818協議支持的常用線速率如下圖 隨著圖像分辨率的提高&#xff0c;單lane的速率無法滿足特定需求&#xff0c;一種方式是通過多個LANE交叉的去傳輸圖像&#xff0c;另外一種是通過降低圖像的帶寬&#xff0c;即通過只傳單色圖像達到對應的效果 程序架構如下圖所示&#x…

透視投影(Perspective projection)與等距圓柱投影(Equirectangular projection)

一、透視投影 1.方法概述 Perspective projection&#xff08;透視投影&#xff09;是一種模擬人眼觀察三維空間物體時的視覺效果的投影方法。它通過模擬觀察者從一個特定視點觀察三維場景的方式來創建二維圖像。在透視投影中&#xff0c;遠處的物體看起來比近處的物體小&…

三.微服務架構中的精妙設計:服務注冊/服務發現-Eureka

一.使用注冊中心背景 1.1服務遠程調用問題 服務之間遠程調?時, 我們的URL是寫死的 String url "http://127.0.0.1:9090/product/" orderInfo.getProductId(); 缺點&#xff1a; 當更換機器, 或者新增機器時, 這個URL就需要跟著變更, 就需要去通知所有的相關服…

FPGA實現4K MIPI視頻解碼H265壓縮網絡推流輸出,基于IMX317+VCU架構,支持4K60幀,提供工程源碼和技術支持

目錄 1、前言工程概述免責聲明 2、相關方案推薦我已有的所有工程源碼總目錄----方便你快速找到自己喜歡的項目我這里已有的 MIPI 編解碼方案我這里已有的視頻圖像編解碼方案 3、詳細設計方案設計框圖FPGA開發板IMX317攝像頭MIPI D-PHYMIPI CSI-2 RX Subsystem圖像預處理Sensor …

Ollama+open-webui搭建私有本地大模型詳細教程

Ollamaopen-webui搭建私有本地大模型詳細教程 1. 什么是 Ollama&#xff1f; 1.1. Ollama 簡介 ? Ollama 是一個輕量級的 AI 模型運行時&#xff0c;專注于簡化 AI 模型的部署和使用。它支持多種預訓練模型&#xff08;如 Llama、Vicuna、Dolly 等&#xff09;&#xff0c;…

解決Centos7集成IDEA報git版本太低問題

Centos 7 服務器上默認安裝的 Git 是 1.8.3.1 版本的 與最新的IDEA已無法匹配&#xff0c;需要更新 首先&#xff0c;卸載老版本 sudo yum -y remove git sudo yum -y remove git-*添加 End Point 到 CentOS 7 倉庫 sudo yum -y install https://packages.endpointdev.com/r…

Qt常用宏定義判斷大全

Qt 提供了一系列預定義宏用于判斷 Qt 版本、操作系統平臺、編譯器特性等。這些宏在跨平臺開發中非常有用。 1. Qt 版本判斷宏 // 檢查Qt版本 #if QT_VERSION > QT_VERSION_CHECK(5, 15, 0)// Qt 5.15.0及以上版本特有代碼 #endif// 常用版本判斷 #if QT_VERSION > QT_V…

實戰 | 餐廳點餐小程序技術解析:SpringBoot + UniApp 高效開發指南

&#x1f5a5;? 一、系統架構概覽 1.1 技術選型 為了確保開發效率和系統穩定性&#xff0c;我們采用以下技術棧&#xff1a; 模塊技術選型后臺服務SpringBoot MyBatis-Plus MySQL用戶端&#xff08;點餐小程序&#xff09;UniApp&#xff08;Vue 語法&#xff09;師傅端&…

實現在Unity3D中仿真汽車,而且還能使用ros2控制

文章目錄 前言&#xff08;Introduction&#xff09;搭建開發環境&#xff08;Setup Development Environment&#xff09;在window中安裝Unity&#xff08;Install Unity in window&#xff09;創建Docker容器&#xff0c;并安裝相關軟件&#xff08;Create Docker containers…

華為配置篇-BGP實驗

BGP 一、簡述二、常用命令總結三、實驗 一、簡述 IBGP 水平分割&#xff1a;從一個 IBGP 對等體學到的路由&#xff0c;不會再通告給其他的 IBGP 對等體。在一個 AS 內部&#xff0c;路由器之間通過 IBGP 交換路由信息。如果沒有水平分割機制&#xff0c;當多個路由器之間形成…

Python視頻標簽工具詳解:基于wxPython和FFmpeg的實現

在當今數字媒體時代&#xff0c;視頻內容的管理和標記變得越來越重要。無論是研究人員需要對實驗視頻進行時間點標記&#xff0c;教育工作者需要對教學視頻添加注釋&#xff0c;還是個人用戶希望對家庭視頻進行分類整理&#xff0c;一個高效的視頻標簽工具都是不可或缺的。本文…

國產三維CAD「皇冠CAD」在汽車零部件領域建模教程:剎車片

本教程深度融合三維皇冠CAD&#xff08;CrownCAD&#xff09;的MBD&#xff08;Model-Based Definition&#xff09;設計理念&#xff0c;通過參數化建模、智能約束管理、動態裝配驗證等功能&#xff0c;實現數據驅動設計&#xff0c;精準解決了汽車制動系統中精密制動組件的設…

C#從入門到精通(3)

目錄 第九章 窗體 &#xff08;1&#xff09;From窗體 &#xff08;2&#xff09;MDI窗體 &#xff08;3&#xff09;繼承窗體 第十章 控件 &#xff08;1&#xff09;控件常用操作 &#xff08;2&#xff09;Label控件 &#xff08;3&#xff09;Button控件 &…

關于跨域與.NET的處理方案

在 Web 開發里&#xff0c;瀏覽器的同源策略是一項關鍵的安全機制。同源指的是兩個 URL 的協議、域名和端口都相同。當瀏覽器從一個源&#xff08;域名、協議、端口&#xff09;的網頁去請求另一個源的資源時&#xff0c;就會產生跨域問題。例如&#xff0c;從 http://www.exam…

react 15-16-17-18各版本的核心區別、底層原理及演進邏輯的深度解析--react18

React 18 是一次重大的版本升級&#xff08;發布于2022年&#xff09;&#xff0c;引入了并發渲染&#xff08;Concurrent Rendering&#xff09; 和一系列新特性&#xff0c;旨在提升應用性能、用戶體驗和開發靈活性。 一、核心新特性 并發模式&#xff08;Concurrent Mode&a…