C 基本型別

2021-08-16 13:11:35 字數 4292 閱讀 5435

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 由作業系統決定,即與作業系統...