c語言內存函數以及數據在內存中的存儲

代碼見:登錄 - Gitee.com

1. memcpy使用和模擬實現

strcpy,strncpy是拷貝字符串的,有局限性

函數原型:

void * memcpy ( void * destination, const void * source, size_t num );
功能:
memcpy 是完成內存塊拷?的,不關注內存中存放的數據是什么
函數 memcpy 從 source 的位置開始向后復制 num 個字節的數據到 destination 指向的內存
位置。
如果 source 和 destination 有任何的重疊,復制的結果都是未定義的。
(內存重疊的情況使? memmove 就?)
memcpy 的使?需要包含 <string.h>
參數:
destination :指針,指向?標空間,拷?的數據存放在這?
source :指針,指向源空間,要拷?的數據從這?來
num :要拷?的數據占據的字節數
返回值:
拷?完成后,返回?標空間的起始地址

2. memmove使用和模擬實現

函數原型:

void * memmove ( void * destination, const void * source, size_t num );
功能:
? memmove函數也是完成內存塊拷?的
? 和memcpy的差別就是memmove函數處理的源內存塊和?標內存塊是可以重疊的。
? memmove的使?需要包含<string.h>
參數:
destination :指針,指向?標空間,拷?的數據存放在這?
source :指針,指向源空間,要拷?的數據從這?來
num :要拷?的數據占據的字節數
返回值:
拷?完成后,返回?標空間的起始地址

3. memset函數的使用

函數原型:

void * memset ( void * ptr, int value, size_t num );
功能:
? memset 函數是?來設置內存塊的內容的,將內存中指定?度的空間設置為特定的內容。
? memset 的使?需要包含 <string.h>
參數:
ptr :指針,指向要設置的內存空間,也就是存放了要設置的內存空間的起始地址。
value :要設置的值,函數將會把 value 值轉換成 unsigned char 的數據進?設置的。也就是
以字節為單位來設置內存塊的。
num :要設置的內存?度,單位是字節。
返回值:返回的是要設置的內存空間的起始地址。

4. memcmp函數的使用

函數原型:

int memcmp ( const void * ptr1, const void * ptr2, size_t num );
功能:
?較指定的兩塊內存塊的內容,?較從ptr1和ptr2指針指向的位置開始,向后的num個字節
memcmp 的使?需要包含 <string.h>
參數:
ptr1 :指針,指向?塊待?較的內存塊
ptr2 :指針,指向另外?塊待?較的內存塊
num :指定的?較?度,單位是字節

返回值:

5.整數在內存中的存儲

整數的2進制有三種表示方式:原碼,反碼和補碼

有符號整數,三種表示方法均有符號位和數值位

無符號整數始終>=0

正整數的原,反,補碼都相同,負整數三種表示方法各不相同。

對于整型:數據存放在內存中實際存放的是二進制的補碼。

因為在計算機系統中,數值?律用補碼來表示和存儲。使用補碼,可以將符號位和數值域統?處理,加法和減法也可以統?處理(CPU只有加法器)。此外,補碼與原碼相互轉換,其運算過程是 相同的,不需要額外的硬件電路。

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

?在a,b中的數字是按照字節為單位,倒著存儲

6.1什么是大小端

超過一個字節的數據在內存中存儲時,有存儲順序的問題,按不同的存儲順序,分為大端字節序存儲和小端字節序存儲。

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

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

6.2為什么有大小端?

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

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

6.3練習

6.3.1練習1

簡述大端字節序和小端字節序的概念,設計?個小程序來判斷當前機器的字節序。

6.3.2練習2

signed char取值范圍:-123~127

unsigned char取值范圍:0~255

6.3.3練習3

6.3.4練習4

6.3.5練習5

6.3.6練習6

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

常見的浮點數:3.14159、1E10(1.0乘以10的十次方)等,浮點數家族包括: float、double、long double 類型.

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

輸出結果是什么?

7.1浮點數的存儲

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

舉例:

IEEE 754規定:

7.1.1浮點數存的過程

IEEE 754對有效數字M和指數E,還有一些特別的規定:

由于1 ≤ M < 2 ,也就是說,M可以寫成 1.xxxxxx 的形式,其中 xxxxxx 表示小數部分。 IEEE754規定,在計算機內部保存M時,默認這個數的第?位總是1,因此可以被舍去,只保存后面xxxxxx部分。比如保存1.01的時候,只保存01,等到讀取的時候,再把第?位的1加上去。這樣做目的,是節省1位有效數字。以32位浮點數為例,留給M只有23位,將第?位的1舍去以后,等于可以保 存24位有效數字。

對于指數E:

E為?個無符號整數(unsigned int)意味著,如果E為8位,它的取值范圍為0~255;如果E為11位,它的取值范圍為0~2047。而科學計數法中的E是可以出現負數的,所以IEEE754規定,存入內存時E的真實值必須再加上 ?個中間數,對于8位的E,這個中間數是127;對于11位的E,這個中間數是1023。比如,2^10的E是10,所以保存成32位浮點數時,必須保存成10+127=137,即10001001。

7.1.2浮點數取的過程

指數E從內存中取出還可以再分成三種情況:

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

浮點數采用下面的規則表示,即指數E的計算值減去127(或1023),得到真實值,再將有效數字M前加上第?位的1。比如:0.5的?進制形式為0.1,由于規定正數部分必須為1,即將小數點右移1位,則為1.0*2^(-1),其階碼為-1+127(中間值)=126,表示為01111110,尾數1.0去掉整數部分為0,補齊0到23位 00000000000000000000000,則其?進制表示形式為:

0 01111110 00000000000000000000000

E全為0

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

0 00000000 00100000000000000000000

E全為1

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

0 11111111 00010000000000000000000

7.2題目解析

回到初始的題目

1.為什么9還原為浮點數就是0.000000?

9以整型的形式存儲在內存中,得到如下?進制序列:

0 00000000 00000000000000000001001

浮點數為:(-1)^0 * 0.00000000000000000001001*2^(-126)=1.001*2^(-146),由于恒接近0,所以表示為0.000000

2.為什么浮點數9.0,整數打印是 1091567616?

9.0? = ?(?1)^0?(1.001)? ? ?2^3

其中:s = 0,E = 3 +127 = 130,其二進制形式:

0 10000010 001 0000 0000 0000 0000 0000

上述為補碼形式,在轉換為原碼,則為1091567616

本章完。

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

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

相關文章

Codeforces Round 787 (Div. 3)(A,B,C,D,E,F,G)

Codeforces Round 787 (Div. 3) - Codeforces A. Food for Animals 題意 有a袋狗糧,b袋貓糧,c袋通用糧食&#xff0c;問現在有x只狗y只貓,每一個動物都要吃一袋糧食,問糧食夠不夠吃 思路 首先肯定考慮貓吃貓糧&#xff0c;狗吃狗糧。然后再考慮如果不夠吃的話才會去吃通用…

LLaMA-Factory的webui快速入門

一、webui的啟動方式 LLaMA-Factory 支持通過 WebUI 零代碼微調大語言模型。 在完成安裝 后&#xff0c;您可以通過以下指令進入 WebUI: llamafactory-cli webui 使用上面命令啟動服務后&#xff0c;即可使用默認7860端口進行訪問。訪問地址&#xff1a;http://ip:7860,截止…

【第四節】ubuntu server安裝docker

首先更新軟件源 sudo apt update sudo apt upgrade安裝docker 下載 Docker 官方 GPG 密鑰 # 1. 下載 Docker 官方 GPG 密鑰 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg再次更新軟件源…

Kubernetes的微服務

用控制器來完成集群的工作負載&#xff0c;那么應用如何暴漏出去&#xff1f;需要通過微服務暴漏出去后才能被訪問Service是一組提供相同服務的Pod對外開放的接口。借助Service&#xff0c;應用可以實現服務發現和負載均衡。service默認只支持4層負載均衡能力&#xff0c;沒有7…

退出登錄后頭像還在?這個緩存問題坑過多少前端!

目錄 1. 為什么退出登錄后頭像還在&#xff1f; ① 緩存沒清理干凈 ② 頭像URL沒更新 ③ 后端會話失效&#xff0c;但靜態資源可訪問 2. 怎么解決&#xff1f;5種常見方案 ? 方案1&#xff1a;強制刷新頁面&#xff08;簡單粗暴&#xff09; ? 方案2&#xff1a;給頭像…

Windows下白嫖ClaudeCode

我的邀請鏈接&#xff1a;https://anyrouter.top/register?afffMJn 我的邀請鏈接&#xff1a;https://anyrouter.top/register?afffMJn 我的邀請鏈接&#xff1a;https://anyrouter.top/register?afffMJn 兄弟們&#xff0c;交個朋友啊&#xff01;一定要用我的呀&#xff0…

windows在anaconda中下載安裝fasttext

windows在anaconda中下載安裝fasttext 1.訪問fasttext-wheel&#xff0c;點擊對應鏈接&#xff0c;下載對應Python版本、操作系統類型 的.whl文件&#xff1a; 鏈接地址&#xff1a;https://pypi.org/project/fasttext-wheel/#files 打開anaconda終端&#xff0c;切換到上面的…

mysql5.7系列-索引下推(cover_index)

什么是索引下推 ICP&#xff08;Index Condition Pushdown&#xff09;是在MySQL 5.6版本上推出的查詢優化策略&#xff0c;把本來由Server層做的索引條件檢查下推給存儲引擎層來做&#xff0c;以降低回表和訪問存儲引擎的次數&#xff0c;提高查詢效率。 回顧下mysql的架構分…

計算機網絡(基礎概念)

計算機網絡&#xff08;基礎概念&#xff09;1 初識協議1.1 協議分層2 OSI七層模型2.1 物理層2.2 數據鏈路層2.3 網絡層2.4 傳輸層2.5 應用層3 TCP/IP協議族3.1 什么是TCP/IP協議?3.1.1 OS與網絡關系4 網絡傳輸的基本流程4.1 局域網4.2 MAC地址5 跨網絡傳輸5.1 IP地址6 Socket…

專題 JavaScript 函數基礎

你將知道&#xff1a;函數聲明和表達式函數聲明和表達式之間的區別什么是匿名函數什么是 IIFE命名函數表達式this 關鍵字函數是調用該函數時執行的代碼塊 。函數聲明和表達式讓我們回顧一下它的語法&#xff1a;functionfunctionName(param1, param2, ..., paramN) {// Functio…

數據結構——優先隊列(priority_queue)的巧妙運用

優先隊列是一種相對高級的數據結構&#xff0c;它的底層原理是二叉堆。然而本篇不會執著于深挖其背后的原理&#xff0c;更主要的是理一下它在題目中的一些實用方法&#xff0c;幫助你更快的上手使用。 優先隊列(priority_queue) 優先隊列的特別之處就在于它可以自動進行排序&…

Java:繼承和多態(必會知識點整理)

主要內容繼承多態向上轉型向下轉型方法重寫方法重載super關鍵字動態綁定封裝訪問控制構造方法規則一、繼承 1. 概念&#xff1a; 一句話說就是&#xff1a;“共性抽取&#xff0c;代碼復用”子類會將父類中的成員變量或者成員方法繼承到子類中子類繼承父類之后&#xff0c;必須…

基于esp32系列的開源無線dap-link項目使用介紹

基于esp32系列的開源無線dap-link項目使用介紹&#x1f516;有關esp32/8266相關項目&#xff1a;需要自己搭建編譯環境&#xff1a; https://github.com/windowsair/wireless-esp8266-dap/tree/master&#x1f33f;支持esp32/c3/s3,支持在線固件燒錄&#xff0c;支持AP配網&…

深入了解linux系統—— 進程信號的產生

前言 進程在收到信號之后&#xff0c;可以立即處理&#xff0c;也可以在合適的時間再處理&#xff08;1-31號普通信號可以不被立即處理&#xff09; 信號不是被立即處理&#xff0c;信號就要被保存下來&#xff0c;讓進程在合適的時間再去處理。 相關概念 在了解進程是如何保存…

【Bluedroid】藍牙協議棧enable流程深度解析

本文詳細剖析 Bluedroid 藍牙功能啟用的核心流程&#xff0c;從enable()函數觸發開始&#xff0c;深入解析藍牙協議棧的異步啟動機制、核心協議模塊初始化、硬件控制器綁定及狀態同步全流程。重點闡述接口就緒性檢查、異步線程管理、配置文件回調機制等關鍵環節&#xff0c;揭示…

各種開發語言主要語法對比

各類主流編程語言的語法有著顯著差異&#xff0c;這些差異源于語言設計哲學&#xff08;簡潔性 vs 顯式性&#xff09;、應用領域&#xff08;系統級、Web、數據科學&#xff09;、運行方式&#xff08;編譯 vs 解釋&#xff09;以及支持的范式&#xff08;面向對象、函數式、過…

小鵬汽車6月交付車輛34,611輛,同比增長224%

小鵬汽車-W(09868)發布公告&#xff0c;2025年6月&#xff0c;小鵬汽車共交付智能電動汽車34,611輛&#xff0c;同比增長224%&#xff0c;這標志著小鵬汽車已連續第八個月交付量超過了30,000輛。2025年第二季度&#xff0c;小鵬汽車共交付103,181 輛智能電動車&#xff0c;創下…

深入理解觀察者模式:構建松耦合的交互系統

在軟件開發中&#xff0c;我們經常遇到這樣的場景&#xff1a;一個對象的狀態變化需要通知其他多個對象&#xff0c;并且這些對象需要根據變化做出相應的反應。比如&#xff0c;用戶界面中的數據變化需要實時反映到多個圖表上&#xff0c;或者電商系統中的庫存變化需要通知訂單…

React強大且靈活hooks庫——ahooks入門實踐之常用場景hook

什么是 ahooks&#xff1f; ahooks 是一個 React Hooks 庫&#xff0c;提供了大量實用的自定義 hooks&#xff0c;幫助開發者更高效地構建 React 應用。其中場景類 hooks 是 ahooks 的一個重要分類&#xff0c;專門針對特定業務場景提供解決方案。 安裝 ahooks npm install …

Qt常用控件之QWidget(一)

Qt常用控件之QWidget&#xff08;一&#xff09;1.QWidget2.enabled屬性2.geometry&#x1f31f;&#x1f31f;hello&#xff0c;各位讀者大大們你們好呀&#x1f31f;&#x1f31f; &#x1f680;&#x1f680;系列專欄&#xff1a;【Qt的學習】 &#x1f4dd;&#x1f4dd;本…