国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

進階C語言-深度剖析數(shù)據(jù)在內(nèi)存中的存儲

這篇具有很好參考價值的文章主要介紹了進階C語言-深度剖析數(shù)據(jù)在內(nèi)存中的存儲。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

進階C語言-深度剖析數(shù)據(jù)在內(nèi)存中的存儲,c語言,開發(fā)語言

??1.數(shù)據(jù)類型介紹

??通過前面的學(xué)習(xí),我們已經(jīng)學(xué)習(xí)了基本的內(nèi)置類型:

char    //字符數(shù)據(jù)類型
short   //短整型
int     //整型
long    //長整型
long long //更長的整型
float   //單精度浮點數(shù)
double   //雙精度浮點數(shù)

??類型的意義

  1. 使用這個類型開辟內(nèi)存空間的大小。
  2. 如何看待內(nèi)存空間的視角。

??1.1類型的基本歸類

??整形家族

//字符在內(nèi)存中存儲的是字符的ASCII碼值,ASCII碼值是整型,所以字符類型歸類到整型家族。
//unsigned-無符號的
//signed-有符號的
char
    unsigned char
    signed char
short
    unsigned short
    signed short
int 
    unsigned int
    signed int
long 
    unsigned long
    signed long

??浮點數(shù)家族

float
double

??構(gòu)造類型(自定義類型)

數(shù)組類型
結(jié)構(gòu)體類型 struct
枚舉類型 enum
聯(lián)合類型 union

??指針類型

int *pi;
char *pc;
float *pf;
void *pv;

??空類型

void表示空類型(無類型)
通常用于函數(shù)的返回類型、函數(shù)參數(shù)、指針類型。

void test(void)
{
//第一個void表示test函數(shù)不會返回任何值
//第二個void表示test函數(shù)沒有參數(shù)
}

??2.整型在內(nèi)存中的存儲

?我們之前了解到一個變量的創(chuàng)建是要在內(nèi)存中開辟空間的,空間的大小是根據(jù)不同的類型決定的。
計算機能夠處理的是二進制的數(shù)據(jù),整型和浮點型數(shù)據(jù)在內(nèi)存中也都是以二進制的形式進行存儲的,想要了解清楚整型在內(nèi)存中的存儲,我們就需要了解一下原碼、反碼和補碼。

??2.1原碼、反碼、補碼

計算機中的整數(shù)有三種2進制表示方法,即原碼、反碼和補碼。
三種表示方法均有符號位和數(shù)值位兩部分,符號位都是用0表示正用1表示負,而數(shù)值位正數(shù)的原、反、補碼都相同。

??負整數(shù)的三種表示方法各不相同:

原碼:直接將數(shù)值按照正負數(shù)的形式翻譯成二進制就可以得到原碼。
反碼:將原碼的符號位不變,其他位依次按位取反就可以得到反碼。
補碼:反碼+1就得到補碼。

?注意:對于整型來說,數(shù)據(jù)存放內(nèi)存中其實存放的是補碼?

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

??2.2大小端介紹

#include <stdio.h>
int main()
{
	int a = 20;
	//原碼、反碼、補碼:0000 0000 0000 0000 0000 0000 0001 0100
	//                    0    0   0    0     0    0     1   4
	//0x 00 00 00 14
	return 0;
}

進階C語言-深度剖析數(shù)據(jù)在內(nèi)存中的存儲,c語言,開發(fā)語言

在前面的示例中,變量a儲存的是補碼,但是順序有點不一樣,這是為什么呢?這里我們就需要了解一下大端小端。
??什么是大端小端?

大端(存儲)模式,是指數(shù)據(jù)的低位保存在內(nèi)存的高地址中,而數(shù)據(jù)的高位,保存在內(nèi)存的低地址中;
小端(存儲)模式,是指數(shù)據(jù)的低位保存在內(nèi)存的低地址中,而數(shù)據(jù)的高位,,保存在內(nèi)存的高地址中。
進階C語言-深度剖析數(shù)據(jù)在內(nèi)存中的存儲,c語言,開發(fā)語言

??為什么有大端和小端:
為什么會有大小端模式之分呢?這是因為在計算機系統(tǒng)中,我們是以字節(jié)為單位的,每個地址單元
都對應(yīng)著一個字節(jié),一個字節(jié)為8 bit。但是在C語言中除了8 bitchar之外,還有16 bitshort
型,32 bitlong型(要看具體的編譯器),另外,對于位數(shù)大于8位的處理器,例如16位或者32
位的處理器,由于寄存器寬度大于一個字節(jié),那么必然存在著一個如何將多個字節(jié)安排的問題。因
此就導(dǎo)致了大端存儲模式和小端存儲模式。
例如:一個 16bitshortx ,在內(nèi)存中的地址為 0x0010x 的值為 0x1122 ,那么 0x11 為高字節(jié), 0x22 為低字節(jié)。對于大端模式,就將 0x11 放在低地址中,即 0x0010 中, 0x22 放在高地址中,即 0x0011 中。小端模式,剛好相反。我們常用的 X86 結(jié)構(gòu)是小端模式,而 KEIL C51 則為大端模式。很多的ARMDSP都為小端模式。有些ARM處理器還可以由硬件來選擇是大端模式還是小端模式。

我們也可以通過一下程序來進行測試:

#include <stdio.h>
int check_sys()
{
	//01 00 00 00
	int i = 1;
	return (*(char*)&i);
}
int main()
{
	int ret = check_sys();
	if (ret == 1)
	{
		printf("小端\n");
	}
	else
	{
		printf("大端\n");
	}
	return 0;
}

進階C語言-深度剖析數(shù)據(jù)在內(nèi)存中的存儲,c語言,開發(fā)語言

??2.3練習(xí)

??練習(xí)1:

#include <stdio.h>
int main()
{
	char a = -1;
	//原碼:10000000000000000000000000000001
	//反碼:11111111111111111111111111111110
	//補碼:11111111111111111111111111111111
	//11111111-a
	signed char b = -1;
	//11111111-b
	unsigned char c = -1;
	//11111111-c
	printf("a = %d,b = %d,c = %d\n", a, b, c);
	//%d是十進制的形式打印有符號的整數(shù)
	//a整型提升:11111111111111111111111111111111
	//反碼:    10000000000000000000000000000000
	//補碼:    10000000000000000000000000000001
	//b整型提升:11111111111111111111111111111111
	//反碼:    10000000000000000000000000000000
	//補碼:    10000000000000000000000000000001
	//c整型提升:00000000000000000000000011111111(正整數(shù)原碼、反碼、補碼一致)為255
	return 0;
}

?運行結(jié)果:
進階C語言-深度剖析數(shù)據(jù)在內(nèi)存中的存儲,c語言,開發(fā)語言
??練習(xí)2:

#include <stdio.h>
int main()
{
	//原碼:10000000000000000000000010000000
	//反碼:11111111111111111111111101111111
	//補碼:11111111111111111111111110000000
	//10000000-a
	//整形提升:11111111111111111111111110000000
	char a = -128;
	//%u-打印無符號整數(shù)
	printf("%u\n", a);
	return 0;
}

?運行結(jié)果:
進階C語言-深度剖析數(shù)據(jù)在內(nèi)存中的存儲,c語言,開發(fā)語言
??練習(xí)3:

#include <stdio.h>
int main()
{
	//原碼:00000000000000000000000010000000
	//反碼:01111111111111111111111101111111
	//補碼:01111111111111111111111110000000
	//10000000-a
	//整形提升:11111111111111111111111110000000
	char a = 128;
	//%u-打印無符號整數(shù)
	printf("%u\n", a);
	return 0;
}

?運行結(jié)果:
進階C語言-深度剖析數(shù)據(jù)在內(nèi)存中的存儲,c語言,開發(fā)語言
??注意
進階C語言-深度剖析數(shù)據(jù)在內(nèi)存中的存儲,c語言,開發(fā)語言
進階C語言-深度剖析數(shù)據(jù)在內(nèi)存中的存儲,c語言,開發(fā)語言
進階C語言-深度剖析數(shù)據(jù)在內(nèi)存中的存儲,c語言,開發(fā)語言

進階C語言-深度剖析數(shù)據(jù)在內(nèi)存中的存儲,c語言,開發(fā)語言
??練習(xí)4:

#include <stdio.h>
int main()
{
	int i = -20;
	//原碼:10000000000000000000000000010100
	//反碼:11111111111111111111111111101011
	//補碼:11111111111111111111111111101100
	unsigned int j = 10;
	//補碼:00000000000000000000000000001010
	//補碼運算結(jié)果:11111111111111111111111111110110
	//反碼:        11111111111111111111111111110101
	//原碼          10000000000000000000000000001010結(jié)果為-10
	printf("%d\n", i + j);
	return 0;
}

?運行結(jié)果:
進階C語言-深度剖析數(shù)據(jù)在內(nèi)存中的存儲,c語言,開發(fā)語言

??3.浮點型在內(nèi)存中的存儲

常見的浮點數(shù):

3.14159
1E10

浮點數(shù)家族包括: float、double、long double 類型。
浮點數(shù)表示的范圍:float.h中定義

??3.1浮點數(shù)存儲規(guī)則

根據(jù)國際標(biāo)準(zhǔn)IEEE(電氣和電子工程協(xié)會) 754,任意一個二進制浮點數(shù)V可以表示成下面的形式:

(-1)^S * M * 2^E

(-1)^S表示符號位,當(dāng)S=0,V為正數(shù);當(dāng)S=1,V為負數(shù)。
M表示有效數(shù)字,大于等于1,小于2。
2^E表示指數(shù)位。
舉例來說:
十進制的5.0,寫成二進制是 101.0 ,相當(dāng)于 1.01×102
那么,按照上面V的格式,可以得出S=0,M=1.01,E=2。
十進制的-5.0,寫成二進制是 -101.0 ,相當(dāng)于 -1.01×2^2 。那么,S=1,M=1.01,E=2。
IEEE 754規(guī)定:
對于32位的浮點數(shù),最高的1位是符號位S,接著的8位是指數(shù)E,剩下的23位為有效數(shù)字M。
對于64位的浮點數(shù),最高的1位是符號位S,接著的11位是指數(shù)E,剩下的52位為有效數(shù)字M。
前面說過, 1≤M<2 ,也就是說,M可以寫成 1.xxxxxx 的形式,其中xxxxxx表示小數(shù)部分。
IEEE 754規(guī)定,在計算機內(nèi)部保存M時,默認這個數(shù)的第一位總是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的時候,只保存01,等到讀取的時候,再把第一位的1加上去。這樣做的目的,是節(jié)省1位有效數(shù)字。以32位浮點數(shù)為例,留給M只有23位,將第一位的1舍去以后,等于可以保存24位有效數(shù)字。至于指數(shù)E,情況就比較復(fù)雜。首先,E為一個無符號整(unsigned int)這意味著,如果E為8位,它的取值范圍為0 ~ 255;如果E為11位,它的取值范圍為0~2047。但是,我們知道,科學(xué)計數(shù)法中的E是可以出現(xiàn)負數(shù)的,所以IEEE 754規(guī)定,存入內(nèi)存時E的真實值必須再加上一個中間數(shù),對于8位的E,這個中間數(shù)是127;對于11位的E,這個中間數(shù)是1023。比如,210的E是10,所以保存成32位浮點數(shù)時,必須保存成10+127=137,即10001001。
然后,指數(shù)E從內(nèi)存中取出還可以再分成三種情況:
E不全為0或不全為1
這時,浮點數(shù)就采用下面的規(guī)則表示,即指數(shù)E的計算值減去127(或1023),得到真實值,再將
有效數(shù)字M前加上第一位的1。
比如:
0.5(1/2)的二進制形式為0.1,由于規(guī)定正數(shù)部分必須為1,即將小數(shù)點右移1位,則為
1.0*2(-1),其階碼為-1+127=126,表示為01111110,而尾數(shù)1.0去掉整數(shù)部分為0,補齊0到23位00000000000000000000000,則其二進制表示形式為:0 01111110 00000000000000000000000
E全為0
這時,浮點數(shù)的指數(shù)E等于1-127(或者1-1023)即為真實值,
有效數(shù)字M不再加上第一位的1,而是還原為0.xxxxxx的小數(shù)。這樣做是為了表示±0,以及接近于
0的很小的數(shù)字。
E全為1
這時,如果有效數(shù)字M全為0,表示±無窮大(正負取決于符號位s)

好啦,關(guān)于數(shù)據(jù)在內(nèi)存中存儲的知識點到這里就結(jié)束啦,后期會繼續(xù)更新C語言的相關(guān)知識,歡迎大家持續(xù)關(guān)注、點贊和評論!??????文章來源地址http://www.zghlxwxcb.cn/news/detail-696238.html

到了這里,關(guān)于進階C語言-深度剖析數(shù)據(jù)在內(nèi)存中的存儲的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 溫故c語言——深度剖析數(shù)據(jù)在內(nèi)存中的存儲

    溫故c語言——深度剖析數(shù)據(jù)在內(nèi)存中的存儲

    數(shù)據(jù)類型詳細介紹 整形在內(nèi)存中的存儲:原碼、反碼、補碼 大小端字節(jié)序介紹及判斷 浮點型在內(nèi)存中的存儲解析 基本內(nèi)置數(shù)據(jù)類型有: 類型的意義: 使用這個類型開辟內(nèi)存空間的大?。ù笮Q定了使用范圍)。 如何看待內(nèi)存空間的視角。 1.1 類型的基本歸類: 整形家族:

    2023年04月22日
    瀏覽(19)
  • 深度剖析數(shù)據(jù)在內(nèi)存中的存儲——int類型(整型)和float類型(浮點數(shù))在內(nèi)存中是如何存儲和使用的?

    深度剖析數(shù)據(jù)在內(nèi)存中的存儲——int類型(整型)和float類型(浮點數(shù))在內(nèi)存中是如何存儲和使用的?

    眾所周知,C語言中有幾種基本的內(nèi)置數(shù)據(jù)類型: char - 字符數(shù)據(jù)類型 short - 短整型 int - 整型 long - 長整型 long long - 更長的整型 float - 單精度浮點數(shù) double - 雙精度浮點數(shù) 那為什么要設(shè)置這么多內(nèi)置數(shù)據(jù)類型呢?類型的意義是什么? 本文將為大家介紹整型和浮點數(shù)在內(nèi)存中的存

    2023年04月22日
    瀏覽(28)
  • 『C語言進階』數(shù)據(jù)在內(nèi)存中的存儲規(guī)則

    『C語言進階』數(shù)據(jù)在內(nèi)存中的存儲規(guī)則

    ?? 博客主頁 : 小羊失眠啦. ?? 系列專欄 : C語言 ??? 每日語錄 : 精誠所至,金石為開。 ?? 感謝大家點贊??收藏?評論?? 前些天發(fā)現(xiàn)了一個巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家。點擊跳轉(zhuǎn)到網(wǎng)站。 小羊近期已經(jīng)將C語言初階學(xué)習(xí)

    2024年02月10日
    瀏覽(22)
  • 數(shù)據(jù)在內(nèi)存中的存儲1(C語言進階)

    數(shù)據(jù)在內(nèi)存中的存儲1(C語言進階)

    ?? 作者簡介 :RO-BERRY 致力于C、C++、數(shù)據(jù)結(jié)構(gòu)、TCP/IP、數(shù)據(jù)庫等等一系列知識,對純音樂有獨特的喜愛 ?? 日后方向 : 偏向于CPP開發(fā)以及大數(shù)據(jù)方向,如果你也感興趣的話歡迎關(guān)注博主,期待更新 我們今天來學(xué)習(xí)數(shù)據(jù)在內(nèi)存中的存儲 前面我們已經(jīng)學(xué)習(xí)了基本的內(nèi)置類型:

    2024年02月16日
    瀏覽(22)
  • c語言進階部分詳解(數(shù)據(jù)在內(nèi)存中的存儲)

    c語言進階部分詳解(數(shù)據(jù)在內(nèi)存中的存儲)

    大家好,今天要進行梳理的內(nèi)容是數(shù)據(jù)在內(nèi)存中的存儲相關(guān)內(nèi)容。 在C語言中,數(shù)據(jù)在內(nèi)存中的存儲是一個非常重要的概念。了解數(shù)據(jù)在內(nèi)存中的存儲方式可以幫助我們更好地理解程序的執(zhí)行過程,優(yōu)化內(nèi)存使用,提高程序的性能。 目錄 一.數(shù)據(jù)類型介紹 1.類型的基本歸類?

    2024年02月13日
    瀏覽(30)
  • 【c語言進階】深入挖掘數(shù)據(jù)在內(nèi)存中的存儲

    【c語言進階】深入挖掘數(shù)據(jù)在內(nèi)存中的存儲

    鐵汁們,今天給大家分享一篇數(shù)組及詳解冒泡排序,來吧,開造?? 類型的 意義 : 類型是用來創(chuàng)建變量, 變量的創(chuàng)建需要在內(nèi)存中開辟一塊內(nèi)存空間 ,用來存儲變量的值, 類型的大小決定了開辟內(nèi)存空間的大小 。 基本內(nèi)置類型: c語言標(biāo)準(zhǔn)只規(guī)定sizeof(long)只要大于等于

    2024年02月08日
    瀏覽(35)
  • C語言進階——數(shù)據(jù)在內(nèi)存中的存儲,你知道嗎?

    C語言進階——數(shù)據(jù)在內(nèi)存中的存儲,你知道嗎?

    之前我們涉及關(guān)于這一部分的知識只是大致的進行講解,今天我們要把這個內(nèi)容詳細的講解和總結(jié)。 在前面我們已經(jīng)學(xué)習(xí)了基本的內(nèi)置類型(內(nèi)置類型就是語言自身定義的類型): char? ? ? ? ? ? ? ? //字符數(shù)據(jù)類型 short? ? ? ? ? ? ? ?//短整型 int? ? ? ? ? ? ? ? ?? //整形

    2024年02月02日
    瀏覽(21)
  • 深度刨析數(shù)據(jù)在內(nèi)存中的儲存(C語言進階)

    深度刨析數(shù)據(jù)在內(nèi)存中的儲存(C語言進階)

    本章重點 數(shù)據(jù)類型詳細介紹 整型在內(nèi)存中的儲存 大小端字節(jié)序介紹及判斷 浮點型在內(nèi)存中的存儲解析 前面我們已經(jīng)介紹過基本的內(nèi)置類型,以及他們所占空間的大小 ?類型的意義 : 使用這個類型開辟內(nèi)存空間的大小(大小決定了適用范圍) 如何看待內(nèi)存空間視角 1.1 類

    2024年02月14日
    瀏覽(19)
  • C進階:數(shù)據(jù)在內(nèi)存中的存儲(1)

    C進階:數(shù)據(jù)在內(nèi)存中的存儲(1)

    大家好,感謝大家最近的支持,今天也是開始了C進階一系列的博文的創(chuàng)作,歡迎大佬們來指點,歡迎來一起溝通?。?! 我們都知道:C語言具有以下幾種數(shù)據(jù)類型: 這里注意的是: sizeof(int) = sizeof(long), 在上述類型中,我們可以通過limits.h中的(MAX和MIN)獲得類型的的最大值

    2024年02月06日
    瀏覽(26)
  • C進階:數(shù)據(jù)在內(nèi)存中的存儲(2)

    C進階:數(shù)據(jù)在內(nèi)存中的存儲(2)

    在上一篇博文中,相信大家對于數(shù)據(jù)類型以及整數(shù)在內(nèi)存中的存儲有了一定了解,那么,浮點數(shù)是怎么在內(nèi)存中存儲的呢?下面來看一下我的講解。 浮點數(shù)家族: 包括:float,double,long double類型。與limits.h相似, 浮點數(shù)也有限制范圍的頭文件float.h. 與limits.h相似,float.h也包括

    2024年02月11日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包