【C初階】數據在內存中的存儲

目錄

1. 整數在內存中的存儲

2. 大小端字節序

2.1 什么是大小端?

2.2 為什么有大小端?

2.3 練習

2.3.1 練習1

2.3.2 練習2

2.3.3 練習3

2.3.4 練習4

2.3.5 練習5

2.3.6 練習6

3. 浮點數在內存中的存儲

3.1?浮點數存儲的過程

3.2?浮點數的取出過程


1. 整數在內存中的存儲

在操作符的那一章的時候,我們就學習了一下內容,不清楚的小伙伴可以返回去看看。

整數的2進制表示方法有三種:原碼、反碼、補碼。

有符號整數,三種表示方法都有符號位和數值位兩部分,符號位0表示正,1表示負,最高位表示符號位,其他的表示數值位。

正整數原碼、反碼、補碼都是相同的。負整數則是各不相同。

其規則為:原碼:將數值按照正負數的形式翻譯為2進制得到的就是原碼。

反碼:原碼的符號位不變,其他位按位取反就可以得到反碼。

補碼:反碼+1得到的就是補碼。

對于整型來說,數據存放在內存中存放的是二進制的補碼。

2. 大小端字節序

我們之前在調試過程中,在查看內存情況時,會有疑惑為啥它是倒著儲存的,其實這里面有它自己的規則。

其實沒必要大驚小怪,有的是正著排的,有的是倒著排的。這就有關于大小端字節序的判斷了。

2.1 什么是大小端?

其實超過一個字節的數據在內存中存儲的時候,就有存儲順序的問題,按照不同的存儲順序,我們分為大端字節存儲和小端字節存儲,下面是具體概念:

大端存儲模式: 是指數據的低位字節內容保存在內存的高地址處。而數據的高位字節內容,保存在內存的低地址處。

小端存儲模式: 是指數據的低位字節內容保存在內存的低地址處,而數據的高位字節內容,保存在內存的高地址處。

這里是要記住的,方便進行區分。

2.2 為什么有大小端?

那么為什么會有大小端之分呢?直接正著存不是更方便嗎?

這是因為在計算機系統中,我們是以字節為單位的,每個地址單元都對應著一個字節,一個字節8個bit位,但是在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(具體要看編譯器),另外,對于位數大于8位的處理器,由于寄存器寬度大于1個字節,那么必然存在著一個如何將多個字節安排的問題,因此就導致了大端字節存儲模式和小端存儲模式。

2.3 練習

2.3.1 練習1

簡述大小端的概念,并設計一個程序檢測當前機器是什么模式。

答:大端:低位字節內容存放在高地址處,高位字節內容存放在低地址處。

小端:低位字節內容存放在低地址處,高位字節內容放在高地址處。

int check_sys()
{int i = 1;return ((char*)&i);
}
int main()
{if (check_sys() == 0)printf("大端\n");elseprintf("小端\n");
}

2.3.2 練習2

int main()
{char a = -1;signed char b = -1;unsigned char c = -1;printf("a = %d, b = %d, c = %d \n", a, b, c);return 0;
}

我們來看看這段代碼會打印什么值?

在計算這段代碼之前,我們先了解一下相關知識。


char :-128~127

signed char :-128~127

unsigned char:0~255?

這些范圍是怎么產生的?為什么就是這個范圍,請看下圖:

這是char的,short、int這些類型都可以以此類推。有了這些知識,我們來解答這道題。

2.3.3 練習3

int main()
{char a = -128;printf("%u\n", a);return 0;
}

%u -- 打印的是無符號整型

int main()
{char a = -128;// 10000000 00000000 00000000 10000000// 11111111 11111111 11111111 01111111// 11111111 11111111 11111111 10000000// 10000000 - a// 11111111 11111111 11111111 10000000// 4294967168printf("%u\n", a);return 0;
}

2.3.4 練習4

int main()
{char a[1000];int i = 0;for (i = 0; i < 1000; i++){a[i] = -1 - i;}printf("%d\n", strlen(a));return 0;
}

不難看出,他直接就是-128~127,也就是255.

2.3.5 練習5

int main()
{unsigned char i = 0;for (i = 0; i <= 255; i++){printf("hello world\n");}return 0;
}

代碼死循環了,因為i<=255這個條件是恒成立的。

2.3.6 練習6

int main()
{int a[4] = { 1,2,3,4 };int* ptr1 = (int*)(&a + 1);int* ptr2 = (int*)((int)a + 1);printf("%x, %x", ptr1[-1], *ptr2);return 0;
}

解題過程:

所以答案是4,2000000 小伙伴們答對了嗎?

3. 浮點數在內存中的存儲

浮點數有很多,比如說3.14159,1E10等。

我們先來看個例子:

int main()
{int n = 9;float* pFloat = (float*)&n;printf("n的值為:%d\n", n);printf("pFloat的值為:%f\n", *pFloat);*pFloat = 9.0;printf("n的值為:%d\n", n);printf("pF的值為:%f\n", *pFloat);return 0;
}

輸出是什么呢?

可以得出:浮點數在內存中的存儲和整數是不同的。

3.1?浮點數存儲的過程

上面的代碼中,n和*pFloat在內存中存儲的明明是同一個數,為什么浮點數和整數的解讀結果會差別那么大?

要理解這個結果,我們需要 搞懂浮點數在計算機內部的表示方法。

根據國際標準IEEE(電氣和電子工程協會)754,任意一個二進制浮點數V可以表示為下面的形式:

V = (-1)^S?* M * 2^E

????????(-1)^S表示符號位,當S=0,V為正數;當S=1,V為負數

????????M表示有效數字,M是大于等于1,小于2的

????????2^E表示的是指數位

舉例來說:

十進制的5.0,寫成二進制是101.0 -- 1.01*2^2。

那么,按照上面V的格式,可以得出S=0,M = 1.01,E = 2。

IEEE754規定:

對于32位的浮點數(float),最高的1位存儲符號位S,接著的8位存儲指數E,剩下的23位存儲有效數字M。

對于64位的浮點數(double),最高的1位存儲符號位S,接著的11位存儲指數E,剩下的52位存儲有效數字M。

IEEE754對有效數字M和指數E,還有一些特別的規定。

前面說過,1 <= M < 2,也就是說M可以寫成1.xxxxxx的形式,其中xxxxxx表示小數部分。

IEEE754規定,在計算機內部保存M時,默認這個數第一位總是1,因此可以舍棄,只保存后面的小數部分。比如說保存1.01時,只保存01,等到讀取的時候,再把第一位的1加上去,這樣做的目的,是節省1位有效數字。以32位浮點數為例,留給M只有23位,將第1位舍棄后,可以保存24位有效數字。

E是一個無符號整數(unsigned int)

這意味著,如果E為8位,它的取值范圍是0~255;如果E為11位,它的取值范圍為0~2047.但是,我們知道,科學計數法中的E是可以出現負數的,所以IEEE754規定,存入內存的E真實值必須再加上一個中間數,對于8位的E,這個中間數是127;對于11位的E,這個中間數是1023.

就拿9.5舉個例子:

浮點數是有可能無法精確保存的,比如說1.2。

3.2?浮點數的取出過程

E不全為0或不全為1(常規情況)

這時,指數E的計算值-127(或1023),得到真實值,再將有效數字M前加上第1位的1。

E全為0

E等于1-127(或1-1023)即為真實值,有效數字M不再加上第一位的1,而是還原為0.xxxxxx的小數,這樣做是為了表示接近0很小的數字。

E全為1

如果有效數字M全為0,表示無窮大;

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

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

相關文章

AI 自動化編程 trae 體驗2 幫我分析一個項目

總結&#xff1a; 接手一個項目可以讓trae 幫忙分析 上次講到trae在處理組件引入的時候&#xff0c;經常會碰到版本問題&#xff0c;分析引入了互聯網上非本版本或者有bug的代碼。主要依賴互聯網的資源庫。 但是分析一個項目應該是沒問題。 這次表現非常好&#xff0c;接手一個…

VMware虛擬機中CentOS 7 報錯 ping: www.xxx.com: Name or service not known

1:主要原因是網絡配置的問題 2:其實就是下面三張圖片中的,物理機虛擬網卡 vmware8 和虛擬機網絡編輯器&#xff0c;如果設置靜態IP 就是這三個地方的問題最簡單的解決辦法第一步&#xff1a;還原虛擬機網絡點擊確認后 ** 第二步給自己的虛擬機設置網絡連接方式 選擇NAT模式連接…

Java面試-自動裝箱與拆箱機制解析

&#x1f44b; 歡迎閱讀《Java面試200問》系列博客&#xff01; &#x1f680;大家好&#xff0c;我是Jinkxs&#xff0c;一名熱愛Java、深耕技術一線的開發者。在準備和參與了數十場Java面試后&#xff0c;我深知面試不僅是對知識的考察&#xff0c;更是對理解深度與表達能力的…

《VMware 安裝 CentOS 7.9 虛擬機詳細教程(含圖解步驟)》

目錄1.安裝前準備1.1 準備VMware軟件1.1.1 方式一1.1.2 方式二1.2 準備centos7.9鏡像1.2.1 方式一1.2.2 方式二2.安裝centos7.91.安裝前準備 1.1 準備VMware軟件 VMware需要的激活碼百度直接搜索vmware workstation17激活碼就可以搜索到 1.1.1 方式一 這種方式需要注冊官網的…

新能源知識庫(84)什么是IEC白皮書

IEC白皮書是由國際電工委員會&#xff08;IEC&#xff09;發布的戰略性技術文件&#xff0c;旨在針對新興技術和社會發展趨勢&#xff0c;提出標準化需求和發展路徑&#xff0c;為全球產業提供前瞻性指導。在新能源領域&#xff0c;IEC白皮書是推動技術創新、產業協同和國際規則…

從零開始學習JavaWeb-15

??一、數據庫安全與防注入實戰??1. ??SQL 注入原理與危害????攻擊本質??&#xff1a;利用輸入漏洞篡改 SQL 語義&#xff0c;例如&#xff1a;SELECT * FROM users WHERE username admin OR 11 -- AND password xxxOR 11導致條件永真&#xff0c;繞過密碼驗證。?…

深入理解深度學習中的“Batch”

文章目錄 **一、什么是Batch?為什么需要它?** **二、Batch Size(批次大小)的影響** **三、Batch, Epoch 和 Iteration 的關系** **四、案例分析** 在深度學習領域,“Batch”(批次)是一個核心且至關重要的概念。它指的是在模型訓練過程中,一次性輸入給神經網絡進行處理的…

27.語言模型

語言模型&#xff0c;是NLP方向一直主力研究的&#xff0c;通過訓練機器&#xff0c;來讓機器學習人類語言的內在規律&#xff0c;理解自然語言&#xff0c;并將其轉換為計算機語言。 目前的主流語言模型&#xff0c;如GPT、Deepseek等&#xff0c;并不是簡單的搜索背誦。他們的…

小智ai+mcp+n8n的智能組合

小智aimcpn8n的智能組合1 小智ai的版本2 n8n的配置3 mcp的demo4 工作流json? 之前有寫過小智ai的介紹&#xff0c;它提供了流暢且豐富的用戶語音交互能力。n8n提供了靈活且穩定的后臺工作流的能力&#xff0c;如果這兩個工具進行組合&#xff0c;可以打造一個好玩又好用的智能…

【DataGrip】連接達夢數據庫后,能查詢數據但是看不到表的幾種情況分析,達夢數據庫驅動包下載DmJdbcDriver18.jar

大概分為以下兩類情況&#xff0c;配置問題和驅動包的問題 DmJdbcDriver18.jar點擊下載 1.配置了表不可見 左上角點擊過濾的圖標&#xff0c;把table勾上就可以 2.Introspect using JDBC metadata 未勾選 1&#xff09;老版本的DataGrip 在options選項下 3&#xff09;新版…

全面解析 `strncasecmp` 字符串比較函數

1) 函數的概念與用途 strncasecmp 是 C 語言中一個非常實用的字符串處理函數&#xff0c;它執行不區分大小寫的字符串比較&#xff0c;但只比較前 n 個字符。這個函數的名字來源于"string n case-compare"&#xff08;字符串前n個字符不區分大小寫比較&#xff09;。…

高級SQL優化 | 告別 Hive 中 GROUP BY 的大 KEY 數據傾斜!PawSQL 自適應優化算法詳解

數據傾斜讓你的Hive查詢慢如蝸牛&#xff1f;單個熱點分組拖垮整個集群&#xff1f;PawSQL獨家算法GroupSkewedOptimization來拯救&#xff01;&#x1f3af; 痛點直擊&#xff1a;當數據傾斜遇上分組操作想象這樣一個場景&#xff1a;你的電商平臺有1000萬VIP用戶訂單和100萬普…

HUMS 2023齒輪箱數據分析

HUMS問答&#xff1a;https://humsconference.com.au/HUMS2023datachallenge/questions-answers.html 數據集申請&#xff1a;https://www.dst.defence.gov.au/our-technologies/helicopter-main-rotor-gearbox-planet-gear-fatigue-crack-propagation-test 歷年試卷&#xff1…

智慧工地:科技賦能與管理革新下的建筑業新圖景

隨著數字技術的深度滲透&#xff0c;智慧工地正以“技術落地 行業變革 管理創新”的三重突破&#xff0c;重構施工場景的核心邏輯&#xff0c;推動建筑業從傳統粗放式發展向精細化、智能化轉型。一、技術落地&#xff1a;用科技筑牢安全防線&#xff0c;提升施工效率技術是智…

[docker/大數據]Spark快速入門

[docker/大數據]Spark快速入門1. 概述 1.1 誕生背景Spark官方文檔&#xff1a;https://spark.apache.ac.cn/docs/latest/Spark 由加州大學伯克利分校 AMP 實驗室于 2009 年開發&#xff0c;2013 年成為 Apache 頂級項目&#xff0c;旨在解決 MapReduce 的三大核心問題&#xff…

CSS 定位的核心屬性:position

&#x1f9e9; 一、CSS 定位的核心屬性&#xff1a;positionposition 屬性用于定義一個元素在頁面中的定位方式&#xff0c;它決定了&#xff1a;元素在頁面中的定位規則是否脫離文檔流元素的位置是相對于誰&#xff08;父元素、瀏覽器窗口、自身等&#xff09;? 可選值如下&a…

數據結構之深入探索快速排序

基準值的選定 我們之前已經用四種不同的方式實現了快速排序&#xff0c;如果還沒有學習過的伙伴們可以看一下這篇文章哦&#xff1a;數據結構之排序大全&#xff08;3&#xff09;-CSDN博客 那我們既然已經學習了這么多種方法&#xff0c;為什么還要繼續探索快速排序呢&#…

《遞歸與迭代:從斐波那契到漢諾塔的算法精髓》

&#x1f525;個人主頁&#xff1a;艾莉絲努力練劍 ?專欄傳送門&#xff1a;《C語言》、《數據結構與算法》、C語言刷題12天IO強訓、LeetCode代碼強化刷題、洛谷刷題、C/C基礎知識知識強化補充、C/C干貨分享&學習過程記錄 &#x1f349;學習方向&#xff1a;C/C方向學習者…

《LINUX系統編程》筆記p3

可重用函數不使用全局部變量&#xff0c;可以重復使用的函數.stat 命令作用&#xff1a;顯示一個文件或文件夾的“元信息”。文件基本信息文件&#xff08;File&#xff09;&#xff1a;顯示所查詢對象的名稱。大小&#xff08;Size&#xff09;&#xff1a;文件的大小&#xf…

大模型0基礎開發入門與實踐:第3章 機器的“統計學”:機器學習基礎概念掃盲

第3章 機器的“統計學”&#xff1a;機器學習基礎概念掃盲 1. 引言 想象一下&#xff0c;你是一位古代的農夫&#xff0c;畢生的經驗告訴你&#xff1a;烏云密布、燕子低飛&#xff0c;那么不久便會下雨。你并沒有學習過氣象學&#xff0c;也不懂大氣壓和水汽凝結的原理。你的“…