鐵汁們,今天給大家分享一篇數(shù)組及詳解冒泡排序,來吧,開造??
數(shù)據(jù)類型介紹
類型的意義: 類型是用來創(chuàng)建變量, 變量的創(chuàng)建需要在內存中開辟一塊內存空間 ,用來存儲變量的值,類型的大小決定了開辟內存空間的大小 。
數(shù)據(jù)類型基本分類及其大小
基本內置類型:
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
printf("%d\n", sizeof(int)); //結果為 4
printf("%d\n", sizeof(short)); //結果為 2
printf("%d\n", sizeof(char)); //結果為 1
printf("%d\n", sizeof(long)); //結果為 4
printf("%d\n", sizeof(long long)); //結果為 8
printf("%d\n", sizeof(float)); //結果為 4
printf("%d\n", sizeof(double)); //結果為 8
return 0;
}
c語言標準只規(guī)定sizeof(long)只要大于等于sizeof(int)即可。
構造類型:
指針類型:char* p、int* a、float* b等。
空類型:void,用于函數(shù)的返回值,函數(shù)參數(shù)、指針類型。
注意:void* p,空指針既不能進行解引用操作,也不能進行加減整數(shù)操作,若想要操作p所指向的值,則需要根據(jù)題意,進行強制類型轉換。
整形在內存中的存儲方式
原碼、反碼、補碼
整形值在計算機內存中有三種不同表示形式:原碼、反碼、補碼。三種表示形式均有一位符號位、其余為均為數(shù)值位。
符號位:0表示正數(shù)、1表示負數(shù);數(shù)值位:原、反、補碼均相同。
負整數(shù)二進制三種表示方式:
原碼:
將數(shù)值根據(jù)正負數(shù)的形式直接翻譯成二進制序列就得到原碼。
反碼:
將原碼符號位不變,其他位依次按位取反(二進制數(shù)位取反,將0變成1,1變成0)就得到反碼。
補碼:
將反碼加一就得到補碼。
注意:正整數(shù)的原碼、反碼、補碼均相同。
例子:
注意:用于計算或存放在內存中全為補碼,涉及該值打印時為原碼(需要把計算的值補碼->反碼->原碼)。
在計算機系統(tǒng)中,數(shù)值全部用補碼來計算和存儲,原因是補碼,可以將符號位和數(shù)值位統(tǒng)一處理,而cpu中只有加法器,需要將減法轉化為加法進行處理。
補碼與原碼相互轉化,其運算過程是相同的:
大小端介紹
前提:以字節(jié)為單位,討論存儲順序。
大端字節(jié)序存儲:
是指數(shù)據(jù)的低位存放在內存中高地址處,數(shù)據(jù)的高位放在內存中低地址處。
小端字節(jié)序存儲:
是指數(shù)據(jù)的低位存放在內存中低地址處,數(shù)據(jù)的高位放在內存中高地址處。
大小端字節(jié)序由來:
在計算機內存中,我們是以字節(jié)為單位的,每個內存單元大小為一個字節(jié),一個字節(jié)對應著8個bit位,但在c語言中除了有8bit的char型,還有16bit位short型,還有32bit位int型,具體為多少要看具體的編譯器,不同編譯器所規(guī)定類型的大小不盡相同,對于位數(shù)大于8位的處理器,寄存器寬度大于1個字節(jié),必然存在如何將多字節(jié)數(shù)排序列的問題,從而引起了大小端的誕生。對于char類型數(shù)據(jù)無大小端存儲模式。
判斷一個系統(tǒng)是大端還是小端
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 1;
char* p = (char*)&a;
printf("%d\n", *p);
return 0;
}
此處博主是用vs2019進行測試的,說明vs編譯器是采用小端字節(jié)序存儲方式進行存儲數(shù)據(jù)。
char與unsigned char值范圍與圖解
char為字節(jié),一個單位,8個bit位,有signed char、unsigned char這兩種類型。
char、signed char范圍:-128~127
unsiged char范圍:0~255
整形存儲相關練習題
擴展知識補充:整形提升
發(fā)生整形提升的條件:字節(jié)數(shù)小于int型,也就是char、short類型在參與計算時會發(fā)生整形提升,因為計算機計算時默認為Int型,4個字節(jié),參與運算。
注意一個數(shù)發(fā)生整形提升時:
a.首先看其自己的類型,若為char、short型,為有符號位,整形提升時看最高位.
b.其次看在打印時,看是以什么格式進行打印,%d是打印有符號位十進制整數(shù)(將該數(shù)看成有符號數(shù),補碼轉化為原碼在進行打印),%u是打印無符號十進制整數(shù)(將該數(shù)看成整數(shù),直接轉化為十進制進行打?。?。
題一、
#define _CRT_SECURE_NO_WARNINGS 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;
}
圖解分析:
題二、
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n", a);
return 0;
}
圖解分析:
題三、
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
char a = 128;
printf("%u\n", a);
return 0;
}
圖解分析:
題四、
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int i = -20;
unsigned int j= 10;
printf("%d\n", i + j);
}
圖解分析:
題五、
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include<Windows.h>
int main()
{
unsigned int i;
for (i = 9; i >= 0; i--)
{
printf("%u\n", i);
Sleep(1000);
}
return 0;
}
題解分析:因為i的類型為unsigned int型,i為正數(shù),i的值>=0,for循環(huán)中的條件判斷恒為真。
浮點數(shù)在內存中的存儲方式
擴展知識:若想要觀察整形家族在內存中的值的范圍,整數(shù)表示的范圍,是在#include<limits.h>中定義,浮點數(shù)值的范圍是在#include<float.h>中定義。
浮點數(shù)存儲規(guī)則
根據(jù)國際標準IEEE(電氣和電子工程協(xié)會)754規(guī)定,任意一個二進制浮點數(shù)科學計數(shù)法變現(xiàn)形式為:
IEEE 754規(guī)定:
對于32位的浮點數(shù)float型(單精度浮點數(shù)),最高1位為符號位S, 接著其后8位為指數(shù)E, 剩下的23位為有效數(shù)字位M。
對于64位的浮點數(shù)double型(雙精度浮點數(shù)),最高1位為符號位S, 接著其后11位為指數(shù)E, 剩下的52位為有效數(shù)字位M。
如圖所示:
將浮點數(shù)存入內存中,IEEE 754對有效數(shù)字M和指數(shù)E的規(guī)定:
對于M:
由于1<=M<2,M可以寫成1.XXXXX形式,其中XXXXX表示小數(shù)部分,在計算機內部保存M時,因默認這個數(shù)的第一位總是1,因此可以被舍去,只保留XXXXX小數(shù)部分。
對于E:
E為一個無符號整數(shù),E為8位時,取值范圍為0到255,E為11位時,取值范圍為0到2047。
但在科學計數(shù)法中的E是可以為負數(shù)的,所以,IEEE754規(guī)定,存入內存時E的真實值必須加上個中間數(shù),對于8位的E,這個中間數(shù)為127,對于11位的E,這個中間數(shù)為1023(若某個數(shù)加上中間數(shù)大于E的取值范圍,則會越界,但由于IEEE 754的規(guī)定,一般不會出現(xiàn)某個數(shù)加上中間數(shù)大于E的取值范圍)。
例子圖解:
將浮點數(shù)從內存中取出,IEEE 754對有效數(shù)字M和指數(shù)E的規(guī)定:
對于M:
把第一位的省略的1直接加上去,其后加個小數(shù)點,在其后加上存入內存中M部分,在特殊情況下M的取出與E也有關。
對于E:分類討論
a.E不全為0或不全為1:將存入內存中的E減去127或者1023,就可得到真實值;
b.E全為0:浮點數(shù)E等于1-127或者1-1023,即為真實值,此時,有效數(shù)字M不在加上第一位的1,而是還原成
0.XXXXX的小數(shù),這樣做的目的是為了表示是0,以及接近1于0的很小數(shù)字。(127-127=E->1.XXx*2^-127約等于0)。
c.E全為1(255=127+128,1.01->*2^128趨向正無窮),此處博主不在展開敘述。
案列
int main()
{
int n = 9;
float *pFloat = (float *)&n;
printf("n的值為:%d\n",n);
printf("*pFloat的值為:%f\n",*pFloat);
*pFloat = 9.0;
printf("num的值為:%d\n",n);
printf("*pFloat的值為:%f\n",*pFloat);
return 0;
}
解析:
a.以整數(shù)的形式放進內存中,在以整數(shù)的形式拿出來,結果才會為整形、以浮點數(shù)的形式放進內存中,在以浮點數(shù)的形式拿出來,結果才會為浮點數(shù)。
b.因為小數(shù)與整數(shù)在內存中的存儲方式不同:
以整數(shù)的形式放在內存中,將其轉化為二進制數(shù),在以浮點數(shù)的形式打印,則將該二進制數(shù)當作浮點數(shù)的二進制數(shù)表示形式,在按照浮點數(shù)從內存中取出的規(guī)則來進行計算。
以浮點數(shù)的形式放在內存中,將其轉化為浮點數(shù)二進制數(shù),在以整數(shù)的形式打印,則將該二進制數(shù)直接當作整數(shù)的二進制數(shù)表示形式,按照補碼->反碼->原碼,進行原碼的打印。
文章來源:http://www.zghlxwxcb.cn/news/detail-481624.html
結語
鐵鐵們,深入挖掘數(shù)據(jù)在內存中存儲就到此結束啦,若博主有不好的地方,請指正,歡迎鐵鐵們留言,請動動你們的手給作者點個??鼓勵吧,你們的鼓勵就是我的動力?文章來源地址http://www.zghlxwxcb.cn/news/detail-481624.html
到了這里,關于【c語言進階】深入挖掘數(shù)據(jù)在內存中的存儲的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!