const限定符
浮點數sizeof()部分問題總結
浮點型:float, double, long double
根據寬度width來排序
char < short < int < long < long long
寬度,表示範圍
很多系統直接用最小長度,short為16位,long為32位,但int可以有很多選擇:16、24、32
short,int, long, long long 都是符號型別,因此在每種型別的取值範圍中,負值和正值幾乎相同,例如,16位的int的取值範圍為-32768到+32767
sizeof()返回型別或變數的長度,單位為byte
位數=8*sizeof(),max = 2^(位數)/2-1; min = -2^(位數)/2
以下結果來自64位windows10系統:
符號型別
sizeof()
maxmin
char
1 byte
char_max = 127
char_min = -128
short
2 bytes
shrt_max = 32767
shrt_max = -32768
int4 bytes
int_max = 2147483647
int_min = -2147483648
long
4 bytes (根據系統和編譯器來定)
long_max = 2147483647
long_min = -2147483648
long long
8 bytes
llong_max = 9223372036854775807
llong_min = -9223372036854775809
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
無符號型別
unsigned short與short
short a = shrt_max;
unsigned short b = a
;a = a+1
;//越界,signed無法表示大於shrt_max的數
b = b+1
;cout<
<
//輸出結果顯示//
-32768
32768
a = b = 0
;a = a-1
;b = b-1
;//越界,unsigned無法表示負數
cout<
<
//輸出結果顯示//
char型別:字元和小數點
char型別專為儲存字元(如字母和數字)而設計。
常用的符號集為ascii字符集。舉例:字母a為65,字母m為77
bool型別
bool is_ready = ture;
bool is_ready = false;
sizeof(bool) 為 1
常量被初始化之後,其值被固定了,編譯器不允許修改該常量的值。
const
int months = 12;//可以在程式中作為常量使用months,months唯讀,不能修改該值
c++第二種基本型別。可以表示帶小數部分的數字。
特別地,e表示法,
3.45e+6等價於3.45*(10^(6))
3.45e-6等價於3.45*(10^(-6))
float < double < long double
float 至少32位
double 至少48位,且不少於float,
long double 至少和double一樣多。通常為80、96或128位
#include
#include
using
namespace
std;
int main()
//輸出結果
300.000000
帶有虛函式的struct結構體
struct a
}sizeof(a) = 8(因為有個指向虛函式表的位址)
不帶有虛函式的struct結構體
struct b
}sizeof(b) = 1
#include
using
namespace
std;
struct st_t ;
int main()
//輸出結果(64位系統)
結構體的大小:8+8+32*1=48
4(int原本為4個位元組,然後要與後面對齊,因此補全為8)
8(指標為8bytes)
32(char為1bytes)
//32位系統
結構體的大小:4+4+32 = 40
4(int原本為4個位元組)
4(指標為4bytes)
32(char為1bytes)
記憶體對齊問題
struct a
struct b
//輸出結果
sizeof(a) = 8
sizeof(b) = 12
原因:1.平台原因(移植原因):不是所有的硬體平台都能訪問任意位址上的任意資料的;某些硬體平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。
2.效能原因:資料結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需要作兩次記憶體訪問;而對齊的記憶體訪問僅需要一次訪問。——記憶體訪問速度提公升
規則:
1. 對於結構的各個成員,第乙個成員位於偏移為0的位置,以後每個資料成員的偏移量必須是min(#pragma pack()指定的數,這個資料成員的自身長度) 的倍數。
2. 在資料成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大資料成員長度中,比較小的那個進行。
pragma pack(n) 表示設定為n位元組對齊。 vc6預設8位元組對齊
32位預設4位元組對齊
64位預設8位元組對齊
分析:
分析struct b: char佔乙個位元組,起始偏移為0 ,int 佔4個位元組,min(#pragma pack()指定的數,這個資料成員的自身長度) = 4(預設8位元組對齊),所以int按4位元組對齊,起始偏移必須為4的倍數,所以起始偏移為4,在char後編譯器會新增3個位元組的額外位元組,不存放任意資料。short佔2個位元組,按2位元組對齊,起始偏移為8,正好是2的倍數,無須新增額外位元組。到此規則1的資料成員對齊結束,此時的記憶體狀態為:(x表示額外新增的位元組)
o***|oooo|oo
0123
4567
89 (位址)
共佔10個位元組。還要繼續進行結構本身的對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大資料成員長度中,比較小的那個進行,st1結構中最大資料成員長度為int,佔4位元組,而預設的#pragma pack 指定的值為8,所以結果本身按照4位元組對齊,結構總大小必須為4的倍數,需新增2個額外位元組使結構的總大小為12 。此時的記憶體狀態為:
o***|oooo|ooxx
0123
4567
89ab (位址)
到此記憶體對齊結束。所以是占用了12個位元組而非7個位元組 c 基本型別
資料型別分為兩種 值型別和引用型別,這兩種型別的物件在記憶體的儲存方式不同。定義 引用型別 表示操作的物件是同乙個,即當傳乙個引數給另乙個方法時,在另乙個方法中改變這個變數的值,那麼呼叫這個方法時傳入的值也將發生變化。值型別 表示複製乙個當前變數傳遞給方法,在方法中改變這個值時,最初生命的變數值不會...
C 的基本型別
在數學中,整數和分數統稱為有理數,無限不迴圈小數和開根開不盡的數統稱為無理數,而有理數和無理數統稱為實數。在計算機中,處理的物件是資料。為了描述不同的物件而需要不同的資料,因此,c 語言提供了豐富的資料型別。c 的資料型別主要包括基本資料型別和構造資料型別。其中基資料本型別包括整型 浮點型 字元型 ...
C語言基本型別詳解
剛剛看到乙個部落格上貼了這個,解決了我一直以來的疑問 int和long是不是一樣的?答案是 不確定。資料型別名稱 位元組數 別名 取值範圍 int signed,signed int 由作業系統決定,即與作業系統的 字長 有關 unsigned int unsigned 由作業系統決定,即與作業系統...