今天和大家分享一下資料在記憶體中的存盤形式,
首先,我們來介紹一下資料的型別
1.char 字符資料型別
2.short 短整型
3.int 整形
4.long 長整形
5.long long 更長的整形
6.float 單精度浮點型
7.double 雙精度浮點型
以上就是資料的基本內置型別
那么我們還可以將資料型別細致地分為以下幾類:
1.整形家族
char:
unsigned char
signed char
short:
unsigned short [int]
signed short [int]
int:
unsigned int
signed int
long:
unsigned long [int]
signed long [int]
2.浮點型家族
float
double
3.構造型別
a.陣列型別
b.結構體陣列 struct
c.列舉型別 enum
d.聯合型別 union
4.指標型別
int *p
char *p
float *p
void *p
5.空型別
void(通常應用于函式回傳型別、函式的引數、指標型別)
下面我們來介紹一下整形是如何在記憶體中存盤的
首先,我們要明確有符號整數在計算機中的三種表示方法:
原碼、反碼、補碼
注意三種表示方法均有符號位和數值位兩部分,符號位0表示正1表示負
對于正數,原碼反碼補碼均相同,為對應的二進制
對于負數來說 原碼是對應的二進制
反碼是保持符號位不變,其他位按位取反(即0變1,1變0)
補碼是在反碼的基礎上加1
我們來舉個例子:

以上就是-12這個數字的原碼、反碼、和補碼的形式,
那么肯定有小伙伴要問了,負數的補碼計算是比較麻煩的,那為什么要有補碼這種形式?都用原碼他不香嗎?
事實上,正因為有了補碼才香,
是這樣的,在計算機系統中,數值一律用補碼來表示和存盤,使用補碼,可以將符號位和數值域統一處理,同時加法和減法也可以統一處理(注意哦,CPU只有加法器而沒有減法器哦)此外,補碼與原碼相互轉換,其運算程序是相同的,不需要額外的硬體電路,是不是很香?
好的,明確了原碼反碼補碼后,我們再來看下一個問題,什么叫大小端?
你可能會問,納尼?大小端是什么鬼?

這個是關于大小端概念的介紹
我們再來看看百度的說法

概念是抽象的,不好理解,講一個故事據說大小端的叫法起源于一本世界名著《格列佛游記》在這本書中有一個吃雞蛋是先吃大頭還是先吃小頭的爭論,命名者受這個啟發于是命名為大小端,這是一個很有意思的故事,也展示了科技與文學之間的浪漫,
同時,這個故事也可以用來幫助我們理解大小端這個概念,試想,作為一名合格的干飯人,如果你可以吃掉整個雞蛋,無論你從大頭吃還是從小頭吃都沒什么關系,因為最后肯定整個雞蛋都是你的,但是如果你一下吃不掉整個雞蛋,從哪頭開始吃,決定了最后你吃到嘴里的雞蛋是這個雞蛋的哪一部分,當實力必須使你舍棄一塊雞蛋時,你能吃到什么,取決于你從哪一邊開始吃,
放到我們這個概念里,這個邏輯還是行得通的,我們來看一個驗證大小端的程式的例子,這個例子采用的方法的本質就類似于,吃不下一個雞蛋,通過吃到的雞蛋的來判斷從哪頭吃的,

我們來分析這個程式

好的,以上是我關于大小端的掌握到的一些知識和一些理解,歡迎大家指正,下面我們一起來看幾道題
我們來看看這個短小精悍的小程式,猜一猜它會輸出什么呢?
#include<stdio.h>
int main()
{
char a = -128;
printf("%u", a);
return 0;
}
答案是:

為什么會出現這樣的結果呢?我們來一起分析一下:

我們再來看下一個題:
#include<stdio.h>
int main()
{
int i = -20;
unsigned int j = 10;
printf("%d\n", i + j);
}

我們來分析一下這個題

我們再來看一個題
#include<stdio.h>
int main()
{
unsigned int i;
for (i = 9; i >= 0; i--)
{
printf("%u\n", i);
}
return 0;
}
猜猜這個題的輸出結果是什么?給你看看這嚇人的效果:

這是一個死回圈,螢屏上噼里啪啦的一直出數也夠嚇人的,哈哈哈,
為什么會出現這樣的結果呢?
我們來分析一下這個程式

我們再來看一個題
#include<stdio.h>
#include<string.h>
int main()
{
char a[1000];
int i;
for (i = 0; i < 1000; i++)
{
a[i] = -1 - i;
}
printf("%d", strlen(a));
return 0;
}
這個題很有陷阱,如果我們不仔細思索的話,大概會認為輸出結果是1000了,開始真相是不是這樣呢?讓我們來看看運行結果

瞧瞧這驚人的結果,為什么不是1000?這合理嗎?這合理!
我們來分析一下這個題

看完以上分析,有沒有豁然開朗的感覺呢?
好了,今天的分享就到這里了,如果感覺我的分享對你有所幫助的話,歡迎點贊、評論、關注哦!由于本人能力有限,難免有錯漏之處,歡迎批評指正!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/255570.html
標籤:其他
上一篇:查看navicat中資料庫密碼
下一篇:C語言編程>第二十二周 ⑤ 下列給定程式中,函式fun的功能是:將字串p中的所有字符復制到字串a中,要求每復制三個字符之后插入一個空格。
