C語言(25)

一.數據在內存中的存儲

1.整數在內存中的存儲

整數在內存中以二進制的形式儲存,分別為原碼,補碼,反碼

有符號的整數,在上述三種形式都有符號位和數值位兩個部分,符號位為0是正數,1是負數,最高位的一位是符號位,剩余的都是數值位

正整數的原碼,補碼,反碼都一樣

負整數的原碼補碼和反碼都各不相同

原碼:直接將數值按照正負數的形式變成二進制就是原碼

反碼:符號位不變,數值位取反

補碼:反碼+1

注意,整數存放數值的補碼形式

2.大小端字節序和字節判斷

實例一

2.1大小端字節序存儲

大端字節序存儲:將數據的低位字節放在內存的高位地址上,高位字節放在內存的低位地址上

小端字節序存儲:將數據的低位字節放在內存的低位地址上,高位字節放在內存的高位地址上

所以實例一是小端字節序存儲

2.2為什么有大小端字節序存儲

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

例如:?個 16bit的 short 型 x ,在內存中的地址為0x0010, x 的值為 0x1122,那么0x11為?字節, 0x22 為低字節。對于?端模式,就將0x11放在低地址中,即 0x0010 中,0x22 放在?地址中,即 0x0011 中。

我們常用的 X86 結構是小端模式,而KEIL C51 為大端模式。很多的ARM,DSP都為小端模式。有些ARM處理器還可以由硬件來選擇是大端還是小端。

2.3練習

2.3.1

如何判斷系統是大端字節序存儲還是小端字節序存儲?

實例二

注釋:取數據的首地址進行char*形式的轉化,然后對其進行解應用看是否是1來進行判斷

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

運算一下,算算答案,下列是運行結果

解析:

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

求a的打印數值是多少

運行結果以及解析:

2.3.4

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

求a經過無符號打印的數值是多少

下列是解析和結果:

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

求出結果

下列是解析和運行結果

解析:char默認是有符號的char,也就是signed char類型,它的有效值是從-128到127,所以數值的變化是-1,-2,-3,-4,...-128,127,126,...0,-1,-2,....一直這么循環。strlen則是一直到\0就會停下,,所以最終結果是255。

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

想想運行結果

下列是運行結果以及解析:

?解析:運行結果陷入無限循環,因為unsigned char類型范圍是從0~255,并且數值變化是循環變化,所以i的值是不會大于255,所以無限循環。

2.3.7
int main()
{unsigned int i;for(i = 9; i >= 0; i--){printf("%u\n",i);}return 0;
}

想想運算結果

下列是結果和解析:

解析:依舊是陷入了無限循環的結果,因為unsigend char的數值一定大于0,所以i<=0一直成立。

2.3.8
#include <stdio.h>
//X86環境 ?端字節序 
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;
}

想想運行結果

下列是運行結果:

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

常見的浮點數:3.14159,1E10(意思是1.0*10**10)等,浮點數類型有float、double、long double類型

浮點數表示的范圍在float.h中定義

3.1引子

int main()
{int n = 9;float* pfloat = (float*)&n;printf("%d\n", n);printf("%f\n", pfloat);*pfloat = 9.0;printf("%d\n", n);printf("%f\n", pfloat);return 0;
}

想一下運行結果會是什么

上述的運行結果是否和你想的一樣呢

上一個例子說明了整數和浮點數在內存的存儲是不一樣的。

3.2浮點數的存儲

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

例如:十進制的10.5轉化成上述的形式的話,10.5化成二進制是1010.1,進而轉化成1.0101*2^3,所以最后的形式就是(-1)^0*1.0101*2^3

(S=0;M=1.0101;E=3)

所以對于浮點數的存儲,只需要存儲S,M,E的相關值就可以表示出浮點數

IEEE 754規定:

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

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

3.2.1浮點數存的過程

對于數字M

因為1<=M<2

IEEE754規定,在計算機內部保存M時,默認這個數的第?位總是1,因此可以被舍去,只保存后面的 xxxxxx部分。比如保存1.01的時候,只保存01,等到讀取的時候,再把第?位的1加上去。

這樣做的目的,是節省1位有效數字。以32位浮點數為例,留給M只有23位,將第?位的1舍去以后,等于可以保存24位有效數字。

對于數字E

首先,E是一個無符號整數

這就意味著,如果E為8位,它的取值范圍就是0~255;如果E為11位,則取值范圍是0~2047.

但是E的取值是可以為負數的,比如0.1中E就是-1,所以IEEE 754規定,存入內存時E的真實值必須再放入一個中間值,對于8位的E,中間值是127,對于11位的E,中間值是1023.

所以如果8位的E的真實值是5,則存入內存的值就是5+127=132,換算成二進制就是10000100

3.2.2浮點數取的過程

指數E從內存中取有三種情況

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

這時,浮點數就采用下面的規則表示,即指數E的計算值減去127(或1027),得到真實值,再在前面加上1作為第一位

E全為0

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

E全為1

這時,如果有效數字M全為0,表示±無窮大(正負取決于符號位s)

例子:

int main()
{float a = 5.5f;//S=0//M=1.011//E=2return 0;
}

自己推算的話就是0 1000000?101100000000000000000000

整理一下就是 0100 0000 1011 0000 0000 0000 0000 0000

? ? ? ? ? ? ? ? ? ? ? ?40? ? ? ? ? ? ? ? ?b0? ? ? ? ? ? ? ? ?00? ? ? ? ? ? 00?

就是下面的結果

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

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

相關文章

鴻蒙開發-一多開發之媒體查詢功能

在HarmonyOS中&#xff0c;使用ArkTS語法實現響應式布局的媒體查詢是一個強大的功能&#xff0c;它允許開發者根據不同的設備特征&#xff08;如屏幕尺寸、屏幕方向等&#xff09;動態地調整UI布局和樣式。以下是一個使用媒體查詢實現響應式布局的實例&#xff1a; 1. 導入必要…

Docker運行hello-world鏡像失敗或超時:Unable to find image ‘hello-world:latest‘ locally Trying to pull reposi

Docker運行hello-world鏡像失敗或超時&#xff0c;報錯&#xff1a;Unable to find image ‘hello-world:latest’ locally Trying to pull repository docker.io/library/hello-world … /usr/bin/docker-current: missing signature key. See ‘/usr/bin/docker-current run …

MySQL連接較慢原因分析及解決措施

文章目錄 整體說明一、問題現象二、問題分析2.1、DNS反向解析問題2.2、網絡問題2.3、SSL/TLS協商問題2.4、自動補全的延遲 三、問題解決 摘要&#xff1a; MySQL連接較慢原因分析及解決措施 關鍵詞&#xff1a; MySQL、連接緩慢、客戶端、參數設置 整體說明 在使用MySQL的時候…

doris:安全概覽

oris 提供以下機制管理數據安全&#xff1a; 身份認證&#xff1a;Doris 支持用戶名/密碼與 LDAP 認證方式。 內置認證&#xff1a;Doris 內置了用戶名/密碼的認證方式&#xff0c;可以自定義密碼策略&#xff1b; LDAP 認證&#xff1a;Doris 可以通過 LDAP 服務集中管理用戶…

C++之文字修仙小游戲

1 效果 1.1 截圖 游戲運行&#xff1a; 存檔&#xff1a; 1.2 游玩警告 注意&#xff01;不要修改裝備概率&#xff0c;裝備的概率都是湊好的數字。如果想要速升&#xff0c;修改靈石數量 2 代碼 2.1 代碼大綱 1. 游戲框架與初始化 控制臺操作&#xff1a;通過 gotoxy() …

Docker安裝部署RabbitMQ

Docker安裝部署RabbitMQ 本文介紹了如何在Linux&#xff08;CentOS 7&#xff09;系統環境下的Docker上安裝部署RabbitMQ的詳細過程。 目錄 Docker安裝部署RabbitMQ一、環境準備1.Linux環境2.Docker3.停止并移除現有的 RabbitMQ 鏡像和容器 二、安裝部署RabbitMQ1.拉取 RabbitM…

【MyBatis Plus 邏輯刪除詳解】

文章目錄 MyBatis Plus 邏輯刪除詳解前言什么是邏輯刪除&#xff1f;MyBatis Plus 中的邏輯刪除1. 添加邏輯刪除字段2. 實體類的配置3. 配置 MyBatis Plus4. 使用邏輯刪除5. 查詢邏輯刪除的記錄 MyBatis Plus 邏輯刪除詳解 前言 MyBatis Plus 是一個強大的持久化框架&#xf…

線性代數(1)用 excel 計算雞兔同籠

線性代數excel計算雞兔同籠 案例&#xff1a;雞兔同籠問題的三種解法&#xff08;遞進式教學&#xff09;一、問題描述二、方程式解法&#xff08;基礎版&#xff09;步驟解析 三、線性代數解法&#xff08;進階版&#xff09;1. 方程組轉化為矩陣形式2. 矩陣求解&#xff08;逆…

Flask中使用WTForms處理表單驗證

在 Flask 中&#xff0c;WTForms 是一個用于 處理表單驗證 的庫&#xff0c;可以與 Flask 結合&#xff0c;提供表單驗證、數據清理、錯誤提示等功能。 1. 安裝 Flask-WTF 首先安裝 Flask-WTF&#xff1a; pip install Flask-WTFFlask-WTF 是 WTForms 的 Flask 擴展&#xff…

24.策略模式實現日志

日志的介紹 計算機中的日志是記錄系統和軟件運行中發送事件的文件&#xff0c;主要作用是監控運行狀態、記錄異常信息&#xff0c;幫助快速定位問題并支持程序員進行問題修復。它是系統維護、故障排查和安全管理的重要工具。 日志格式以下幾個指標是必須得有的&#xff1a; ?…

【網絡】簡單的 Web 服務器架構解析,包含多個服務和反向代理的配置,及非反向代理配置

這張圖片描述了一個簡單的 Web 服務器架構&#xff0c;包含多個服務和反向代理的配置。以下是對每個部分的詳細解釋&#xff0c;幫助你理解其中的技術內容&#xff1a; 1. Web Server: ifn666.com 這是你的主域名&#xff08;ifn666.com&#xff09;&#xff0c;所有服務都通過…

???????大語言模型安全風險分析及相關解決方案

大語言模型的安全風險可以從多個維度進行分類。 從輸入輸出的角度來看,存在提示注入、不安全輸出處理、惡意內容生成和幻覺錯誤等風險; 從數據層面來看,訓練數據中毒、敏感信息泄露和模型反演攻擊是主要威脅; 模型自身則面臨拒絕服務和盜竊的風險; 供應鏈和插件的不安全引…

貪心算法——c#

貪心算法通俗解釋 貪心算法是一種"每一步都選擇當前最優解"的算法策略。它不關心全局是否最優&#xff0c;而是通過局部最優的累積來逼近最終解。優點是簡單高效&#xff0c;缺點是可能無法得到全局最優解。 一句話秒懂 自動售貨機找零錢&#xff1a;用最少數量的…

STM32 - 在機器人領域,LL庫相比HAL優勢明顯

在機器人控制器、電機控制器等領域的開發&#xff0c;需要高實時性、精細化控制或者對代碼執行效率、占用空間有較高要求。所以&#xff0c;大家常用的HAL庫明顯不符合要求。再加上&#xff0c;我們學習一門技術&#xff0c;一定要學會掌握底層的原理。MCU開發的底層就是寄存器…

【計算機網絡】2物理層

物理層任務:實現相鄰節點之間比特(或)的傳輸 1.通信基礎 1.1.基本概念 1.1.1.信源,信宿,信道,數據,信號 數據通信系統主要劃分為信源、信道、信宿三部分。 信源:產生和發送數據的源頭。 信宿:接收數據的終點。 信道:信號的傳輸介質。 數據和信號都有模擬或數字…

deepseek GRPO算法保姆級講解(數學原理+源碼解析+案例實戰)

文章目錄 什么是GRPO群組形成(Group Formation):讓大模型創建多種解決方案偏好學習(Preference Learning)&#xff1a;讓大模型理解何為好的解答組內相對優勢 優化(optimization): 讓大模型從經驗中學習(learning from experience)目標函數 GRPO算法的偽碼表示GRPO算法的局限與…

使用 WebP 優化 GPU 紋理占用

WebP 格式相比 JPEG / PNG 文件更小&#xff0c;可以 減少 GPU 紋理內存占用&#xff0c;提高 WebGL / Three.js / 3D 渲染 的性能。 &#x1f539; 為什么 WebP 能減少 GPU 內存占用&#xff1f; 文件更小 → WebP 比 JPG/PNG 壓縮率更高&#xff0c;減少 紋理上傳 帶寬&…

Google Cloud Run 如何實現無服務器(Serverless)部署?

DDoS&#xff08;分布式拒絕服務&#xff09;攻擊是黑客常用的一種手段&#xff0c;通過大量惡意流量沖擊服務器&#xff0c;導致網站無法訪問。針對這種威脅&#xff0c;Cloudflare提供了一整套防護措施&#xff0c;包括流量過濾、速率限制、防火墻規則等&#xff0c;使網站能…

QuickAPI 和 DBAPI 誰更香?SQL生成API工具的硬核對比(一)

最近低代碼開發火得不行&#xff0c;尤其是能把數據庫秒變API的工具&#xff0c;簡直是開發者的救星。今天咱就聊聊兩款國內玩家&#xff1a;QuickAPI&#xff08;麥聰軟件搞出來的低代碼神器&#xff09;和 DBAPI&#xff08;開源社區的硬核作品&#xff09;。這兩貨都能靠SQL…

BigEvent項目后端學習筆記(一)用戶管理模塊 | 注冊登錄與用戶信息全流程解析(含優化)

&#x1f4d6; 模塊概述 用戶管理模塊是系統的核心基礎模塊&#xff0c;包含 注冊、登錄、用戶信息維護 等功能。本模塊涉及 JWT Token認證、密碼加密存儲、文件上傳 等關鍵技術點&#xff0c;是理解前后端分離架構中安全與數據交互的典型實踐。本篇對于原項目進行了代碼優化&…