c-語言->數據在內存的存儲

系列文章目錄

文章目錄

  • 系列文章目錄
  • 前言


前言

目的:學習整數在內存的儲存,什么是大小端,浮點數的儲存。

1. 整數在內存中的存儲

在講解操作符的時候,我們就講過了下?的內容:

整數的2進制表??法有三種,即 原碼、反碼和補碼。

正整數的原、反、補碼都相同。
負整數的三種表??法各不相同。
原碼:直接將數值按照正負數的形式翻譯成?進制得到的就是原碼。
反碼:將原碼的符號位不變,其他位依次按位取反就可以得到反碼。
補碼:反碼+1就得到補碼,補碼也可以取反+1得到源碼。
三種表??法均有符號位和數值位兩部分,符號位都是?0表?“正”,?1表?“負”,?數值位最
?位的?位是被當做符號位,剩余的都是數值位。
數據存放內存中其實存放的是補碼。 為什么呢?
在計算機系統中,數值?律?補碼來表?和存儲。
原因在于,使?補碼,可以將符號位和數值域統?處理;
同時,加法和減法也可以統?處理(CPU只有加法器)此外,補碼與原碼相互轉換,其運算過程是
相同的,不需要額外的硬件電路。

2. ??端字節序和字節序判斷

當我們了解了整數在內存中存儲后,我們調試看?個細節:
#include <stdio.h>
int main()
{int a = 0x11223344;return 0;
}

調試一下,我們可以看到在a中的 0x11223344 這個數字是按照字節為單位,倒著存儲的。

2.1 什么是??端?

其實超過?個字節的數據在內存中存儲的時候,就有存儲順序的問題,按照不同的存儲順序,我們分 為?端字節序存儲和?端字節序存儲,下?是具體的概念:
1.?端(存儲)模式:是指數據的低位字節內容保存在內存的?地址處,?數據的?位字節內容,保存 在內存的低地址處。
2.?端(存儲)模式:是指數據的低位字節內容保存在內存的低地址處,?數據的?位字節內容,保存 在內存的?地址處。
上述概念需要記住,?便分辨??端。

?圖片展示一下:

?2.2 為什么有??端?

這是因為在計算機系統中,我們是以字節為單位的,每個地址單元都對應著?個字節,?個字節為8 bit 位,但是在C語?中除了8 bit 的 char 之外,還有16 bit 的 short 型,32 bit 的 long 型(要看具體的編譯器),另外,對于位數?于8位的處理器,例如16位或者32位的處理器,由于寄存器寬度? 于?個字節,那么必然存在著?個如何將多個字節安排的問題。因此就導致了?端存儲模式和?端存 儲模式。
例如:?個 16bit short x ,在內存中的地址為 0x0010 x 的值為 0x1122 ,那么
0x11 為?字節, 0x22 為低字節。對于?端模式,就將 0x11 放在低地址中,即 0x0010 中,
0x22 放在?地址中,即 0x0011 中。?端模式,剛好相反。我們常?的 X86 結構是?端模式,?
KEIL C51 則為?端模式。很多的ARM,DSP都為?端模式。有些ARM處理器還可以由硬件來選擇是 ?端模式還是?端模式。
所以說vs是小端字節序環境。
那么如何利用程序判斷是大端字節序還是小端字節序呢?
案例1:
//代碼1
#include <stdio.h>
int check_sys()
{int i = 1;return (*(char *)&i);//下面分析:
}
int main()
{int ret = check_sys();if(ret == 1){printf("?端\n");}else{printf("?端\n");}return 0;
}

分析:

下面我們 來做一些有關數據的儲存的練習:

案例1:

#include <stdio.h>
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;
}

輸出結果:

我們來一個一個分析:

?b變量也是和a是一樣的

?案例2:

#include <stdio.h>
int main()
{char a = -128;printf("%u\n",a);return 0;
}

char的范圍-128~127,那這個案例輸出結果為:

這是為什么呢?

分析如圖:

在這里我們記住兩圖,記住就行:

signed char:

?unsigned char:

案例3:

#include <stdio.h>
int main()
{char a[1000];int i;for(i=0; i<1000; i++){a[i] = -1-i;}printf("%d",strlen(a));return 0;
}

在這里上面那幅圖就很重要了,輸出結果是:

字符串長度找到\0.也就是0

循環到255時在++,變成了0,所以是255.

案例4:

#include <stdio.h>
unsigned char i = 0;
int main()
{for(i = 0;i<=255;i++){printf("hello world\n");}return 0;
}

這個一看就是死循環,unsigned char的值范圍0~255,所以會一直打印hello world。

案例5:

#include <stdio.h>
int main()
{unsigned int i;for(i = 9; i >= 0; i--){printf("%u\n",i);}return 0;
}

輸出結果:

也是死循環為什么?因為i = -1時,位無符號-1的無符號是一個很大的正數,所以死循環。

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

常?的浮點數:3.14159、1E10等,浮點數家族包括: float double long double 類型。
浮點數表?的范圍: float.h 中定義
根據國際標準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。
?進制的-5.0,寫成?進制是 -101.0 ,相當于 -1.01×2^2 。那么,S=1,M=1.01,E=2。
(1)對于32位的浮點數,最?的1位存儲符號位S,接著的8位存儲指數E,剩下的23位存儲有效數字M
(2)對于64位的浮點數,最?的1位存儲符號位S,接著的11位存儲指數E,剩下的52位存儲有效數字M

3.1浮點數存數的過程

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

前?說過, 1 M<2 ,也就是說, M可以寫成 1.xxxxxx 的形式 ,其中 xxxxxx 表??數部分。 IEEE 754 規定,在計算機內部保存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是可以出現負數的,所以IEEE 754規定,存?內存時E的真實值必須再加上 ?個中間數,對于8位的E, 這個中間數是127 ;對于11位的E,這個中間數是1023。 ?如,2^10的E是 10,所以保存成32位浮點數時,必須保存成10+127=137,即10001001.
案例1:
#include<stdio.h>
int main()
{float  a = 5.5f; return 0;
}

那么浮點數是如何儲存進儲存的呢?

不妨看看詳細分析:

3.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
好了,關于浮點數的表?規則,就說到這?。
來看一道練習案例1:
#include <stdio.h>
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("*pFloat的值為:%f\n",*pFloat);return 0;
}

輸出結果:

這是為什么呢?來一個一個分析:

?所以不要把浮點數和正數打印錯了。

好了,今天就到這里了,都看到這里了,點一個贊吧,謝謝觀看。

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

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

相關文章

設計模式之觀察者模式(主題對象發生變化,通知各個觀察者)

當涉及到電商場景時&#xff0c;觀察者模式可以用于處理多種情況&#xff0c;比如訂單狀態更新、庫存變化、用戶積分變化等。下面是一個簡化的訂單狀態更新的觀察者模式案例。 1.首先&#xff0c;定義一個主題接口 OrderSubject /*** Description:主題&#xff0c;用于管理觀察…

基于Java會員管理系統

基于Java會員管理系統 功能需求 1、會員信息管理&#xff1a;該系統需要提供會員信息管理功能&#xff0c;包括會員的姓名、性別、年齡、聯系方式等基本信息。同時&#xff0c;還需要提供會員的消費記錄、積分、優惠券等信息的管理。 2、會員注冊和登錄&#xff1a;系統需要…

動手學習深度學習-跟李沐學AI-自學筆記(3)

一、深度學習硬件-CPU和GPU 芯片&#xff1a;Intel or AMD 內存&#xff1a;DDR4 顯卡&#xff1a;nVidia 芯片可以和GPU與內存通信 GPU不能和內存通信 1. CPU 能算出每一秒能運算的浮點運算數&#xff08;大概0.15左右&#xff09; 1.1 提升CPU利用率 1.1.1 提升緩存…

自動駕駛學習筆記(十六)——目標跟蹤

#Apollo開發者# 學習課程的傳送門如下&#xff0c;當您也準備學習自動駕駛時&#xff0c;可以和我一同前往&#xff1a; 《自動駕駛新人之旅》免費課程—> 傳送門 《Apollo 社區開發者圓桌會》免費報名—>傳送門 文章目錄 前言 匹配關聯 軌跡記錄 狀態預測 總結 前…

【文件上傳系列】No.2 秒傳(原生前端 + Node 后端)

上一篇文章 【文件上傳系列】No.1 大文件分片、進度圖展示&#xff08;原生前端 Node 后端 & Koa&#xff09; 秒傳效果展示 秒傳思路 整理的思路是&#xff1a;根據文件的二進制內容生成 Hash 值&#xff0c;然后去服務器里找&#xff0c;如果找到了&#xff0c;說明已經…

【智能家居】七、人臉識別 翔云平臺編程使用(編譯openSSL支持libcurl的https訪問、安裝SSL依賴庫openSSL)

一、翔云 人工智能開放平臺 API文檔開發示例下載 二、編譯openSSL支持libcurl的https訪問 安裝SSL依賴庫openSSL(使用工具wget)libcurl庫重新配置&#xff0c;編譯&#xff0c;安裝運行&#xff08;運行需添加動態庫為環境變量&#xff09; 三、編程實現人臉識別 四、Base6…

12.4每日一題(備戰藍橋杯順序結構程序設計)

12.4每日一題&#xff08;備戰藍橋杯順序結構程序設計&#xff09; 題目1000: 【入門】AB Problem題目描述輸入輸出樣例輸入樣例輸出來源/分類 題解 1000: 【入門】AB Problem題目 2124: 計算(ab)c的值題目描述輸入輸出樣例輸入樣例輸出來源/分類 題解 2124: 計算(ab)c的值題目…

UML案例分析

首先需要花大約20分鐘來思考解決這個問題&#xff0c;如果對問題不是很熟悉&#xff0c;也可以在完成題目之后&#xff0c;找相關的資料翻閱&#xff08;例如看UML類圖的基本情況&#xff0c;UML狀態圖的基本情況&#xff0c;然后結合這些信息 做一個自我評價&#xff0c;看這個…

matlab 最小二乘擬合空間直線(方法三)

目錄 一、算法原理1、算法過程2、參考文獻二、代碼實現三、結果展示四、相關鏈接博客長期更新,GPT與爬蟲自重,你也未必能爬到最新版本。 一、算法原理 1、算法過程 空間直線的點向式方程為:

poe與chatgpt那個功能更強大

在當前的人工智能領域&#xff0c;Poe Al Chat以其卓越的聊天能力和實用的功能&#xff0c;受到了大家的廣泛關注和喜愛。本文好為您個紹Poe Al Chat的功能&#xff0c;以及我們國內用戶如何進行充值訂閱。Poe Al Chat是一個基于OpenAl的GPT模型開發的人工智能聊天工具。它能夠…

基于Springboot的校園失物招領系統(有報告)。Javaee項目,springboot項目。

演示視頻&#xff1a; 基于Springboot的校園失物招領系統&#xff08;有報告&#xff09;。Javaee項目&#xff0c;springboot項目。 項目介紹&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三層體系結構…

Docker鏡像和容器的簡單操作

1.鏡像管理 搜索鏡像&#xff1a; 這種方法只能用于官方鏡像庫 搜索基于 centos 操作系統的鏡像 # docker search centos 按星級搜索鏡像&#xff1a; 查找 star 數至少為 100 的鏡像&#xff0c;默認不加 s 選項找出所有相關 ubuntu 鏡像&#xf…

為 setTimeout 或 setInterval 提供一個字符串作為第一個參數(js的問題)

首先&#xff0c;需要知道的是為 setTimeout 或 setInterval 提供一個字符串作為第一個參數&#xff0c;這本身并不是一個錯誤。它是完全合法的JavaScript代碼。這里的問題更多的是性能和效率的問題。很少有人解釋的是&#xff0c;如果你把字符串作為setTimeout或setInterval的…

46.0/基本的 HTML 標簽(詳細版)

目錄 46.1 標題 46.2 段落 Paragraph, 46.3 換行 46.4 HTML 注釋 46.5 空格 46.6 水平線 46.7 控制網頁中文字的標記 46.8 居中標記 46.9 預格式化文本 46.10 網頁背景 46.1 標題 標記解釋 標題使用 <h1> 至 <h6> 標簽進行定義。 <h1> 定…

uniapp如何制作一個收縮通訊錄(布局篇)

html&#xff1a; <view class"search"><view class"search_padding"><u-search change"search" placeholder"請輸入成員名稱" v-model"keyword"></u-search></view></view> <view…

C語言有哪些預處理操作?

C語言的預處理是在編譯之前對源代碼進行處理的階段&#xff0c;它主要由預處理器完成。預處理器是一個獨立的程序&#xff0c;它負責對源代碼進行一些文本替換和處理&#xff0c;生成經過預處理的代碼。以下是C語言預處理的一些重要特性&#xff1a; 1&#xff0c;頭文件包含 #…

Ansible中執行流控制

1.ansible中的迭代循環 創建目錄和文件 vim createfile.yaml - name: create file playbook hosts: all tasks: - name: create file file: path: "/mnt/{{item[name]}}" state: …

Unity 自定義窗口

放在Editor文件夾下&#xff1b; #if UNITY_EDITORusing System; using UnityEditor; using UnityEngine;namespace EditorCustumTool {/// <summary>/// 自定義窗口/// </summary>public class CustomWindow : EditorWindow{public enum FlagType{Flag1 101,Fl…

前端知識筆記(三十六)———HTTP 緩存機制

一、強制緩存 只要瀏覽器判斷緩存沒有過期&#xff0c;則直接使用瀏覽器的本地緩存而無需再請求服務器。 強制緩存是利用下面這兩個 HTTP 響應頭部&#xff08;Response Header&#xff09;字段實現的&#xff0c;它們都用來表示資源在客戶端緩存的有效期&#xff1a; Cache-…

java中對象和Map互相轉換的幾種方式

在Java中&#xff0c;將對象和Map相互轉換是常見的操作&#xff0c;可以通過不同的方式實現這種轉換。以下是幾種常見的方法以及示例說明&#xff1a; 1. 使用Hutool工具類 Hutool是一個優秀的Java工具包&#xff0c;提供了豐富的工具方法&#xff0c;其中就包括對象和Map之間…