型別,不光出現在定義變數的時候,還有使用變數的時候,
-
型別決定了開辟空間的大小
存的角度,定義變數時使用何種型別就代表分配給變數多大的記憶體空間,這個變數最大能擁有多少空間,
如:
int a
就分配給了a
變數4個位元組的空間,char
就是1個位元組,
-
看待記憶體空間的方式
取的角度,以什么樣的方式去看待空間里的資料,(這邊說是取,其實有點牽強,最多說是看)
如
int a;
和unsigned int b;
和float c;
,編譯器認為a
是有符號整型,b
是無符號整型,c
是浮點型
int a = 10;
float b = 10.0f;
a
和b
都是4個位元組,為何還要分你是int
我是float
呢?因為看待這4個位元組的視角不一樣,編譯器認為a
里存放的整型資料,而b
是浮點型變數,
創建變數的實質是在記憶體上為其開辟一塊空間,空間大小由變數型別決定,那么資料在記憶體中到底是如何存盤的呢?
一、整型:
我們直接看程式吧:
#include <iostream>
using namespace std;
int main()
{
int a = 0x12345678;//十六進制數
printf("%d\n",&a);
char *p;
p = (char *)&a;
for(int i = 0;i < 4;i++){
printf("%d\n",p + i);//輸出每個位元組的地址
printf("%x\n\n",*(p + i));
}
return 0;
}
結果是:
按照一般的想法,應該是12345678才對啊,怎么按照地址順序成了78563412了呢?這就涉及到整型資料在計算機的存盤,分為小端序和大端序,
在32位系統中,一個int為四個位元組,32位二進制,資料在記憶體中以補碼的形式存盤,
==》正數的補碼是本身
==》負數的補碼等于它取反加1
我使用的Dev-C++是一個小端機,記憶體顯示是從低地址開始讀的,說到小端機,一定會有人問是不是還有大端機?
下面我們一起來看看大小端的區別:
大端機:資料低地址存放高位元組,高地址存放低位元組 例:C51單片機
小端機:資料低地址存放低位元組,高地址存放高位元組 例:X86
一個整型的占4個位元組 它的地址是用最低位來表示,
!!幾句代碼查看什么端:
int a = 0x12345678;
short *p = (short*)&a;
printf("%#x\n", *p);//小端列印為0x5678,雖然存是低地址存低位元組,但取不一樣,所以是0x5678,
一個地址占8位,16進制轉換為2進制占2個,所以78在一起,56在一起,
二、浮點型
還是直接上例子:
#include <iostream>
using namespace std;
int main()
{
float a = 178.125;
float *p = &a;
char *q = (char*)&a;
for(int i = 0;i < 4;i ++){
printf("地址:%d\n",q + i);
printf("地址值:%#x\n",*(q + i));
}
return 0;
}
結果是這樣:
我們把它轉換成二進制看看(小端序):0100 0011 0011 0010 0010 0000 0000 0000,這是一件十分頭大的事,看起來就像天書一樣,
現在大致說一下:我們始終記得,計算機只認識二進制,在計算機中,不管是什么型別的資料,最終只會變成二進制,不同的資料型別可能存的值一樣,只是取得方式不一樣,而浮點數在計算機是這樣存盤的:
//(double)1位符號位,11位指數位,52位尾數位,//
如果E為8位,它的取值范圍為0~255;如果E為11位,它的取值范圍為0~2047,但是我們知道,科學計數法中的E是可以出現負數的,所以,存入記憶體時E的真實值必須再加上一個中間數,對于8位的E,這個中間數是127;
將十進制178.125表示成機器內的32位的二進制形式-->
1:將178.125表示成二進制數:
(178.125)(十進制數) = (10110010.001)(二進制形式);
2:將二進制形式的浮點實數轉化為規格化的形式:
10110010.001 = 1.0110010001 * 2 ^ 7 (小數點向左移7二進制位可得)
3:符號位(1位):
該數為正數,故第31位為0,占一個二進制位.
4:階碼(8位):
指數為7,故其階碼為127 + 7 = 134 = (10000110)(二進制),占從第30到第23共8個二進制位.
5:尾數(32 - 8 - 1 = 23位):
為小數點后的部分, 即0110010001.因為尾數共23個二進制位,在后面補13個0,即01100100010000000000000
6:178.125在記憶體中的實際表示方式為:
0 10000110 01100100010000000000000,這是不是我們在程式中看到的場景呢!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/412827.html
標籤:C++
上一篇:c++的左值(lvalue),右值(rvalue),移動語意(move),完美轉發(forward)
下一篇:返回列表