日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

C语言入门经典——基础知识(数据类型)(32位与64位系统基本数据类型的字节数)

發布時間:2025/10/17 windows 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言入门经典——基础知识(数据类型)(32位与64位系统基本数据类型的字节数) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、讀取數據的格式說明符? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

除此之外:?????sizeof(char) =?? 1? ? ? ? ? ? ? ? ? ??sizeof(long long) =? 8? ? ? ? ? ? ? ? ? ? ??sizeof(long? double) =? 12

????????????????????????????? sizeof(unsigned char) = 1? ? ? ? ? ? sizeof(unsigned long long) = 8

sizeof運算符可以確定給定的類型占據的字節數。在C語言中sizeof是一個關鍵字。其結果是一個無符號的整數,可以用%u說明符輸出它。其可以確定某個基本的類型的值所占用的內存空間。例如:sizeof(int)會得到int類型的變量所占的字節數,所得的是一個size_t類型的整數。

? ? 注意:我們希望把sizeof運算符應用于一個類型,則該類型名就必須放在括號中,例如:sizeof(long double) 。將sizeof運算符應用于表達式時,括號就是可選的。

32位與64位系統數據類型

不同的平臺上對不同的數據類型分配的字節數是不同的,一般的,數據類型的字節數是由編輯器決定的(編譯期間決定數據類型長度)。

簡單來說,平臺就是CPU+OS+Compiler,cpu的位是指一次性可處理的數據量是多少,1字節=8位,32位處理器可以一次性處理4個字節的數據量,依次類推。32位操作系統針對的32位的CPU設計。64位操作系統針對的64位的CPU設計。所以平臺是三者的組合,它們的字節長相同時,效率最高。

下面是32位系統與64位系統各數據類型對比:

二、極限值

????? ? %u? ? ?輸出無符號整數值。

????????%e? ? ?輸出浮點數的極限值,表示這個數值是指數形式。

????????%f? ? ? 說明符表示沒有指數的數值,它對于非常大或非常小的數來說相當不方便。

表示整數類型的極限值的符號(limits.h)類型??下限上限

char? ? ? ?%d

?

unsigned char? ? ? %u

CHAR_MIN? ? -128

?

? ? ? ? ? ? ? ? ? ? ? ? 0????

CHAR_MAX? ? ?127

?

UCHAR_MAX? ? 255

short? ? %d

?

unsigned short? ? ?%u

SHRT_MIN? ? -32768

?

? ? ? ? ? ? ? ? ? ? ? ? 0

SHRT_MAX? ? ? 32767

?

USHRT_MAX? ? ?65535

int? ? ? ? ? %d

?

unsigned? int? ? ? ? %u

INT_MIN? ? ? ? -2147483648

?

? ? ? ? ? ? ? ? ? ? ? ? 0

INT_MAX? ? ? ? ? 2147483647

?

UINT_MAX? ? ? ? 4294967295

long? ? ? %ld

?

unsigned? long? ? ?%lu

LONG_MIN? ? -2147483648

?

? ? ? ? ? ? ? ? ? ? ? ? 0

LONG_MAX? ? ? 2147483647

?

ULONG_MAX? ? 4294967295

long long? %lld

?

unsigned? long long? ?%llu

LLONG_MIN? -9223372036854775808

?

? ? ? ? ? ? ? ? ? ? ? ? 0

LLONG_MAX? ??9223372036854775807

?

ULLONG_MAX??18446744073709551615

表示浮點數類型的極限值的符號(float.h)類型下限上限
float? ? ? ? ? ? ? ? %e????FLT_MIN??1.175e-38FLT_MAX? ?3.402823e+38
double? ? ? ? ? ? %eDBL_MIN? ?2.225e-308DBL_MAX? ?1.797693e+308
long double? ? %LeLDBL_MIN??3.362e-4932LDBL_MAX??1.189731e+4932
#include<stdio.h> #include<limits.h> #include<float.h> int main(void) {printf("char stor values from %d to %d\n",CHAR_MIN,CHAR_MAX);printf("float stor values from %.3e to %e\n",FLT_MIN,FLT_MAX);printf("long stor values from %ld to %ld\n",LONG_MIN,LONG_MAX);printf("unsigined long long stor values from 0 to %llu\n",ULLONG_MAX);printf("double stor values from %.3e to %e \n",DBL_MIN,DBL_MAX);printf("double stor values from %.3Le to %Le \n",LDBL_MIN,LDBL_MAX);return 0; }

一系列的printf()函數調用中,輸出<limits.h><float.h>頭文件中定義的符號的值。計算機中的數值總是受限于該機器可以存儲的值域,這些符號的值表示每種數值類型的極限值。

三、類型轉換

#include<stdio.h> int main(void) {const float Revenue_Per_150 = 4.5f;//每銷售150個產品的收入short JanSold = 23500; //一月份的銷售額short FebSold = 19300;short MarSold = 21600;float RevQuarter = 0.0f; //每個季度的總收入short QuarterSold = JanSold + FebSold + MarSold;//一個季度總銷售額printf("Stock sold in \nJan:%d\nFeb:%d\nMar:%d\n",JanSold,FebSold,MarSold);printf("Total stock sold in first quarter:%d\n",QuarterSold);RevQuarter = QuarterSold/150*Revenue_Per_150;printf("Sales revenue this quarter is:$%.2f\n",RevQuarter);//這個季度的銷售收入return 0; }

? ? 輸出的結果如下所示:顯然輸出的結果是錯誤的,不應該是得到的負值。

Stock sold in Jan:23500 Feb:19300 Mar:21600 Total stock sold in first quarter:-1136 Sales revenue this quarter is:$-31.50

錯誤1:QuarterSold變量聲明為short類型,其初始值定義為3個月的銷售總額,總和是64400,而對于short類型而言,其最大值是32767?,F在問題來了,我們試圖在變量中存儲對short類型而言過大的數字,計算機不能正確解釋QuarterSold的值,所以輸出了負數。

解決辦法:給QuarterSold變量使用unsigned long類型。來存儲非常大的數字,還可以把每月銷售量的變量指定為無符號類型。

錯誤2:RevQuarter = QuarterSold/150*Revenue_Per_150; 由于乘除的優先級相同,先回計算64400/150=429.333 最終會舍棄.333。在下一步計算過程中會有出入。

解決辦法:方案1:語句改為RevQuarter = QuarterSold*Revenue_Per_150/150;

????????????? ? 方案2:語句改為RevQuarter = QuarterSold/150.0*Revenue_Per_150;

????????????? ? 方案3:語句改為RevQuarter = (float)QuarterSold/150*Revenue_Per_150;

//最終正確的格式如下: #include<stdio.h> int main(void) {const float Revenue_Per_150 = 4.5f;//每銷售150個產品的收入unsigned short JanSold = 23500; //一月份的銷售額unsigned short FebSold = 19300;unsigned short MarSold = 21600;float RevQuarter = 0.0f; //每個季度的總收入unsigned long QuarterSold = JanSold + FebSold + MarSold;//一個季度總銷售額printf("Stock sold in \nJan:%u\nFeb:%u\nMar:%u\n",JanSold,FebSold,MarSold); printf("Total stock sold in first quarter:%d\n",QuarterSold);//-->>Total stock sold in first quarter:64400RevQuarter =(float) QuarterSold/150*Revenue_Per_150;printf("Sales revenue this quarter is:$%.2f\n",RevQuarter);//這個季度的銷售收入 //-->>Sales revenue this quarter is:$1932.00return 0; }

?

強制類型轉換:一種類型顯示轉化為另一種類型的過程。

?

? ? ?把變量從一種類型轉換為另一種類型,應該把目標類型放在變量前面的括號中。例如:RevQuarter =(float) QuarterSold/150*Revenue_Per_150;

????????? 把表達式從一種類型強制轉換為另一種類型。此時,應該把表達式放在括號中。例如:result = (fouble)(a*a + b*b);?

隱式類型轉換:在二元算數運算中使用不同類型的操作數,編譯器就會把其中一個值域較小的操作數類型轉化為另一個操作數的類型。 例如:RevQuarter = QuarterSold/150*Revenue_Per_150;計算為64400(int)/150(int),結果是429(int) , 再將429(int轉換為float)乘以4.5(float),得到1930.5(float)。因為Int類型的值域小于float類型。? ?

?//隱式類型轉換的規則 (1)如果一個操作數的類型是long double,就把另一個操作數轉換為long double類型。 (2)否則,如果一個操作數的類型是double,就把另一個操作數轉換為double類型。 (3)否則,如果一個操作數的類型是float,就把另一個操作數轉換為float類型。 (4)否則,如果兩個操作數的類型都是帶符號的整數或者無符號的整數,就把級別較低的操作數換位另一個操作數類型。無符號整數類型的級別從低到高為:signed char ,short ,int ,long ,long long每個無符號的整數類型的級別都與對應的帶符號整數類型相同,所以unsigned int類型的級別與int類型的相同。 (5)否則,如果帶符號整數類型的操作數級別低于無符號整數類型的級別,就把帶符號整數類型的操作數轉換為無符號整數類型。 (6)否則,如果帶符號的整數類型的值域包含了無符號整數類型所表示的值,就把無符號的整數類型轉換為帶符號的整數類型。 (7)否則,兩個操作數都轉換為帶符號的整數類型對應的無符號的整數類型。//賦值語句中的隱式類型轉換例如: long double tital_cost = double cost;當操作數的類型不同時候,賦值操作總是要把右操作數的結果轉換為做操作數的類型。所以上述操作的結果會轉化為long double類型。編譯器不會發出警告,因為double類型的所有值都可以表示為long double.//隱式類型轉換的規則 (1)如果一個操作數的類型是long double,就把另一個操作數轉換為long double類型。 (2)否則,如果一個操作數的類型是double,就把另一個操作數轉換為double類型。 (3)否則,如果一個操作數的類型是float,就把另一個操作數轉換為float類型。 (4)否則,如果兩個操作數的類型都是帶符號的整數或者無符號的整數,就把級別較低的操作數換位另一個操作數類型。無符號整數類型的級別從低到高為:signed char ,short ,int ,long ,long long每個無符號的整數類型的級別都與對應的帶符號整數類型相同,所以unsigned int類型的級別與int類型的相同。 (5)否則,如果帶符號整數類型的操作數級別低于無符號整數類型的級別,就把帶符號整數類型的操作數轉換為無符號整數類型。 (6)否則,如果帶符號的整數類型的值域包含了無符號整數類型所表示的值,就把無符號的整數類型轉換為帶符號的整數類型。 (7)否則,兩個操作數都轉換為帶符號的整數類型對應的無符號的整數類型。//賦值語句中的隱式類型轉換例如: long double tital_cost = double cost;當操作數的類型不同時候,賦值操作總是要把右操作數的結果轉換為做操作數的類型。所以上述操作的結果會轉化為long double類型。編譯器不會發出警告,因為double類型的所有值都可以表示為long double.

四、枚舉

??? 在編程時候,常常希望存儲一組可能值中的一個?。例如:一個變量存儲表示當前月份的值。這個值應該只存儲12個可能值中的一個,分別對應于1~12月。

? ? ?4.1 枚舉類型的定義

?????????? ? ? ? ??enum Weekday{Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday};

? ? ? ? ? ? ? ? ? ?enum? Weekday today? =? Thursday;

????????? ?只要希望變量有限定數量的可能值,就可以使用枚舉。

????????? ?第一個語句定義了枚舉類型Weekday,這個類型的變量可以有括號中的7個值得任意一個。

????????? ?第二個語句定義了Weekday類型的一個變量,把它初始化為Thursday,其對應的值是3。

? ? ?? 1>格式為: enum ?枚舉的標記 {枚舉器/枚舉常量};,知Weekday是一個標識符,可有可無;

????? 2>枚舉常量的名稱必須是唯一的;枚舉器有默認值,編譯器會把int類型的整數值賦予給每個名稱;名稱間用逗號,隔開;其數量是可以任意的;枚舉器的值不要求是唯一的,除非有特殊原因讓某些枚舉器的值相同,否則應確保這些值也是唯一的;

? ? ? ?3>枚舉是一個整數類型, 每個枚舉常量對應不同的整數值;

? ? ? ?4>第一個枚舉成員的默認值為整型的0,后續枚舉成員的值在前一個成員上加1。

? ? ? 5> 可以人為設定枚舉成員的值,從而自定義某個范圍內的整數。 ?

? ? ? 6> 枚舉型是預處理指令#define的替代。

? ? ? 7> 類型定義以分號;結束。

? ? ?4.2 使用枚舉類型對變量進行聲明? ?

新的數據類型定義完成后,它就可以使用了。我們已經見過最基本的數據類型,如:整型int, 單精度浮點型float, 雙精度浮點型double, 字符型char, 短整型short等等。用這些基本數據類型聲明變量通常是這樣:

char???? a;?//變量a的類型均為字符型char
char???? letter;
int??????? x,
?????????? y,
?????????? z;?//變量x,y和z的類型均為整型int
int?????? number;
double? m,?n;
double? result;?//變量result的類型為雙精度浮點型double

?

既然枚舉也是一種數據類型,那么它和基本數據類型一樣也可以對變量進行聲明。

方法一:枚舉類型的定義和變量的聲明分開

enum?DAY
{
??????MON=1,?TUE,?WED,?THU,?FRI,?SAT,?SUN
};

?

enum?DAY?yesterday;
enum?DAY?today;
enum?DAY?tomorrow;?//變量tomorrow的類型為枚舉型enum?DAY
enum?DAY?good_day,?bad_day;?//變量good_day和bad_day的類型均為枚舉型enum?DAY

?

方法二:類型定義與變量聲明同時進行:

//未命名的枚舉類型,

//在創建枚舉類型的變量時,可以不指定標記,這樣就沒有枚舉類型了。其可能的枚舉器從saturday到friday
//該語句還生命了未命名類型的變量workday;可以用通常的方式給其賦值。
//局限性:只要限制是,必須在定義該類型的語句中聲明它的所有變量。由于沒有類型名,無法在代碼的后面定義該類型的其他的變量
enum
?//跟第一個定義不同的是,此處的標號DAY省略,這是允許的。
{
????saturday,
????sunday?
=?0,
????monday,
????tuesday,
????wednesday,
????thursday,
????friday
}?workday;?
//變量workday的類型為枚舉型enum?DAY

workday =? monnday;

?

enum?week?{?Mon=1,?Tue,?Wed,?Thu,?Fri?Sat,?Sun}?days;?//變量days的類型為枚舉型enum?week

?

enum?BOOLEAN?{?false,?true?}?end_flag,?match_flag;?//定義枚舉類型并聲明了兩個枚舉型變量

?

方法三:用typedef關鍵字將枚舉類型定義成別名,并利用該別名進行變量聲明:

typedef?enum?workday
{
????saturday,
????sunday?=?0,
????monday,
????tuesday,
????wednesday,
????thursday,
????friday
}?workday;?//此處的workday為枚舉型enum?workday的別名

?

workday?today,?tomorrow;?//變量today和tomorrow的類型為枚舉型workday,也即enum?workday

?

enum workday中的workday可以省略:

typedef?enum
{
????saturday,
????sunday?=?0,
????monday,
????tuesday,
????wednesday,
????thursday,
????friday
}?workday;?//此處的workday為枚舉型enum?workday的別名

workday?today,?tomorrow;?//變量today和tomorrow的類型為枚舉型workday,也即enum?workday

?

也可以用這種方式:

typedef?enum?workday
{
????saturday,
????sunday?=?0,
????monday,
????tuesday,
????wednesday,
????thursday,
????friday
};

workday?today,?tomorrow;?//變量today和tomorrow的類型為枚舉型workday,也即enum?workday

?

注意:同一個程序中不能定義同名的枚舉類型,不同的枚舉類型中也不能存在同名的命名常量。錯誤示例如下所示:

錯誤聲明一:存在同名的枚舉類型

typedef?enum
{
????wednesday,
????thursday,
????friday
}?workday;

typedef?enum?WEEK
{
????saturday,
????sunday?=?0,
????monday,
}?workday;

?

錯誤聲明二:存在同名的枚舉成員

typedef?enum
{
????wednesday,
????thursday,
????friday
}?workday_1;

typedef?enum?WEEK
{
????wednesday,
????sunday?=?0,
????monday,
}?workday_2;

?

? ?4.3 使用枚舉類型的變量? ??

4.3.1 對枚舉型的變量賦值。

實例將枚舉類型的賦值與基本數據類型的賦值進行了對比:

方法一:先聲明變量,再對變量賦值

#include<stdio.h>

/*?定義枚舉類型?*/
enum?DAY?{?MON=1,?TUE,?WED,?THU,?FRI,?SAT,?SUN?};

void?main()
{
????/*?使用基本數據類型聲明變量,然后對變量賦值?*/
????int?x,?y,?z;
????
????x?=?10;
????y?=?20;
????z?=?30;
????
????/*?使用枚舉類型聲明變量,再對枚舉型變量賦值?*/
????enum?DAY?yesterday,?today,?tomorrow;
????
????yesterday?=?MON;
????today?????=?TUE;
????tomorrow??=?WED;

????printf("%d?%d?%d?\n",?yesterday,?today,?tomorrow);
}

?

方法二:聲明變量的同時賦初值

#include?<stdio.h>

/*?定義枚舉類型?*/
enum?DAY?{?MON=1,?TUE,?WED,?THU,?FRI,?SAT,?SUN?};

void?main()
{
????/*?使用基本數據類型聲明變量同時對變量賦初值?*/
????int?x=10,?y=20,?z=30;

????/*?使用枚舉類型聲明變量同時對枚舉型變量賦初值?*/
????enum?DAY?yesterday?=?MON,?
?????????????????????? ?today?=?TUE,
?????????????????? tomorrow?=?WED;

????printf("%d?%d?%d?\n",?yesterday,?today,?tomorrow);
}

?

方法三:定義類型的同時聲明變量,然后對變量賦值。

#include?<stdio.h>

/*?定義枚舉類型,同時聲明該類型的三個變量,它們都為全局變量?*/
enum?DAY?{?MON=1,?TUE,?WED,?THU,?FRI,?SAT,?SUN?}?yesterday,?today,?tomorrow;

/*?定義三個具有基本數據類型的變量,它們都為全局變量?*/
int?x,?y,?z;

void?main()
{
????/*?對基本數據類型的變量賦值?*/
????x?=?10;??y?=?20;??z?=?30;
????
????/*?對枚舉型的變量賦值?*/
????yesterday?=?MON;
????today?????=?TUE;
????tomorrow??=?WED;

????printf("%d?%d?%d?\n",?x,?y,?z);?//輸出:10?20?30
????printf("%d?%d?%d?\n",?yesterday,?today,?tomorrow);?//輸出:1?2?3
}

?

方法四:類型定義,變量聲明,賦初值同時進行。

#include?<stdio.h>

/*?定義枚舉類型,同時聲明該類型的三個變量,并賦初值。它們都為全局變量?*/
enum?DAY
{
????MON=1,?
????TUE,
????WED,
????THU,
????FRI,
????SAT,
????SUN?
}
yesterday?=?MON,?today?=?TUE,?tomorrow?=?WED;

/*?定義三個具有基本數據類型的變量,并賦初值。它們都為全局變量?*/
int?x?=?10,?y?=?20,?z?=?30;

void?main()
{
????printf("%d?%d?%d?\n",?x,?y,?z);?//輸出:10?20?30
????printf("%d?%d?%d?\n",?yesterday,?today,?tomorrow);?//輸出:1?2?3
}

?

4.3.2 對枚舉型的變量賦整數值時,需要進行類型轉換。

#include?<stdio.h>

enum?DAY?{?MON=1,?TUE,?WED,?THU,?FRI,?SAT,?SUN?};

void?main()
{
????enum?DAY?yesterday,?today,?tomorrow;

????yesterday?=?TUE;
????today?=?(enum?DAY)?(yesterday?+?1);?//類型轉換
????tomorrow?=?(enum?DAY)?30;?//類型轉換
????
//tomorrow?=?3;?//錯誤

????printf("%d?%d?%d?\n",?yesterday,?today,?tomorrow);?//輸出:2?3?30
}

?

4.3.3 使用枚舉型變量

#include<stdio.h>

enum
{?
????BELL??????????=?'\a',
????BACKSPACE?=?'\b',
????HTAB?????????=?'\t',
????RETURN???? ?=?'\r',
????NEWLINE????=?'\n',?
????VTAB?????????=?'\v',
????SPACE???????=?'?'
};

enum?BOOLEAN?{?FALSE?=?0,?TRUE?}?match_flag;

void?main()
{
????int?index?=?0;
????int?count_of_letter?=?0;
????int?count_of_space?=?0;

????char?str[]?=?"I'm?Ely?efod";

????match_flag?=?FALSE;

????for(;?str[index]?!=?'\0';?index++)
????????if(?SPACE?!=?str[index]?)
????????????count_of_letter++;
????????else
????????{
????????????match_flag?=?(enum?BOOLEAN)?1;
????????????count_of_space++;
????????}
????
????printf("%s?%d?times?%c",?match_flag???"match"?:?"not?match",?count_of_space,?NEWLINE);
????printf("count?of?letters:?%d?%c%c",?count_of_letter,?NEWLINE,?RETURN);
}

?

輸出:
match 2 times
count of letters: 10
Press any key to continue

4.4 枚舉類型與sizeof運算符

復制代碼 #include <stdio.h>enum escapes { BELL = '\a',BACKSPACE = '\b',HTAB = '\t',RETURN = '\r',NEWLINE = '\n', VTAB = '\v',SPACE = ' ' };enum BOOLEAN { FALSE = 0, TRUE } match_flag;void main() {printf("%d bytes \n", sizeof(enum escapes)); //4 bytesprintf("%d bytes \n", sizeof(escapes)); //4 bytesprintf("%d bytes \n", sizeof(enum BOOLEAN)); //4 bytesprintf("%d bytes \n", sizeof(BOOLEAN)); //4 bytesprintf("%d bytes \n", sizeof(match_flag)); //4 bytesprintf("%d bytes \n", sizeof(SPACE)); //4 bytesprintf("%d bytes \n", sizeof(NEWLINE)); //4 bytesprintf("%d bytes \n", sizeof(FALSE)); //4 bytesprintf("%d bytes \n", sizeof(0)); //4 bytes }

4.5 選擇枚舉值

可以給任意或所有的枚舉器指定自己的整數值。盡管枚舉器使用的名稱必須是唯一的,但是枚舉器的值不要求是唯一的。除非有特殊的原因讓某些枚舉器的值相同,否則一般應確保這些值也是唯一的。

例如:

4.6 綜合舉例

#include<stdio.h>enum Season {spring, summer=100, fall=96, winter };typedef enum {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday } Weekday;void main() {/* Season */printf("%d \n", spring); // 0printf("%d, %c \n", summer, summer); // 100, dprintf("%d \n", fall+winter); // 193enum Season mySeason=winter;if(winter==mySeason)printf("mySeason is winter \n"); // mySeason is winterint x=100;if(x==summer)printf("x is equal to summer\n"); // x is equal to summerprintf("%d bytes\n", sizeof(spring)); // 4 bytes/* Weekday */printf("sizeof Weekday is: %d \n", sizeof(Weekday)); //sizeof Weekday is: 4Weekday today = Saturday;Weekday tomorrow;if(today == Monday)tomorrow = Tuesday;elsetomorrow = (Weekday) (today + 1); //remember to convert from int to Weekdayprintf("today == %d? ?tomorrow == %d\n",today,tomorrow); // today == 5? ?tomorrow == 6 }

參考鏈接:

? ? ?enum與typedef enum的用法:https://blog.csdn.net/king16304/article/details/52193562

總結

以上是生活随笔為你收集整理的C语言入门经典——基础知识(数据类型)(32位与64位系统基本数据类型的字节数)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。