詳細(xì)講解C語言中的數(shù)據(jù)以及位運(yùn)算
C語言中數(shù)據(jù)的表示方法
各種數(shù)據(jù)類型可表示的數(shù)值范圍
C語言編譯器在<limits.h>頭文件中以宏定義的形式定義了字符型以及其他整型所能表示的數(shù)值的最大值和最小值。
下面來看看在VC++環(huán)境下的各數(shù)據(jù)類型所能表示的數(shù)值范圍。
#include <stdio.h> #include <limits.h> int main(void) { puts("該環(huán)境下各字符型、整型數(shù)值的范圍:"); printf("char :%d~%d\n",CHAR_MIN,CHAR_MAX); printf("signed char :%d~%d\n",SCHAR_MIN,SCHAR_MAX); printf("unsigned char :%d~%d\n",0,UCHAR_MAX); printf("short :%d~%d\n",SHRT_MIN,SHRT_MAX); printf("int :%d~%d\n",INT_MIN,INT_MAX); printf("long :%d~%d\n",LONG_MIN,LONG_MAX); printf("unsigned short :%d~%d\n",0,USHRT_MAX); printf("unsigned int :%u~%u\n",0,UINT_MAX); printf("unsigned long :%lu~%lu\n",0,ULONG_MAX); return 0; }
位和CHAR_BIT
計(jì)算機(jī)中的所有數(shù)據(jù)都是用0和1(即“位”)的組合來表示的。
C語言中“位”(bit)的定義如下:
- “位”是具有大量?jī)?nèi)存空間的運(yùn)行環(huán)境的數(shù)據(jù)存儲(chǔ)單元,可保存具有兩種取值的對(duì)象。
- “位”可取兩種值,其中一種是0。將位設(shè)為0以外的值,稱為“設(shè)置位”。
根據(jù)編譯器的不同,char型
在內(nèi)存上占據(jù)的位數(shù)
也不同。該位數(shù)作為對(duì)象式宏CHAR_BIT
定義在<limits.h>中。
char型的位數(shù)因編譯器
而定,至少為8
。
能夠用字符型表示的數(shù)值范圍
是依附于CHAR_BIT
的。
#include <stdio.h> #include <limits.h> int main(void) { printf("char 型在內(nèi)存上占據(jù)的位數(shù):%d\n",CHAR_BIT); return 0; }
char型的內(nèi)部:
sizeof運(yùn)算符
C語言中將表示字符的char型的長(zhǎng)度
定義為1
。(char的長(zhǎng)度可以通過計(jì)算機(jī)硬件的位數(shù)來確定。在32位系統(tǒng)中,char占用1個(gè)字節(jié)(8位);在64位系統(tǒng)中,char也仍然占用1個(gè)字節(jié)(8位)。這意味著char的長(zhǎng)度不會(huì)隨著計(jì)算機(jī)系統(tǒng)的升級(jí)而改變。)
通過使用sizeof運(yùn)算符
(sizeof operator),可以判斷出包括chai型在內(nèi)的所有數(shù)據(jù)類型的長(zhǎng)度
。該運(yùn)算符以字節(jié)(bite)
為單位。
下面我們來使用sizeof運(yùn)算符,顯示字符型和整型的長(zhǎng)度。
#include <stdio.h> int main(void) { printf("sizeof(char)=%d\n",sizeof(char)); printf("sizeof(short)=%d\n",sizeof(short)); printf("sizeof(int)=%d\n",sizeof(int)); printf("sizeof(long)=%d\n",sizeof(long)); printf("sizeof(unsigned char)=%u\n",(unsigned)sizeof(char)); printf("sizeof(unsigned short)=%u\n",(unsigned)sizeof(short)); printf("sizeof(unsigned int)=%u\n",(unsigned)sizeof(int)); printf("sizeof(unsigned long)=%u\n",(unsigned)sizeof(long)); return 0; }
程序的運(yùn)行結(jié)果因編譯器和編譯環(huán)境的不同而不同。但sizeof(char)
必為1
。`各種數(shù)據(jù)類型的有符號(hào)型
和無符號(hào)型
的長(zhǎng)度相同。例如,sizeof(short)和sizeof(unsigned short)相等,sizeof(long)和sizeof(unsigned long)相等。short 、int、long具有如下關(guān)系:
sizeof(short)≤sizeof(int)≤sizeof(long)
即右側(cè)的數(shù)據(jù)類型和左側(cè)的數(shù)據(jù)類型相等,或者大于左側(cè)的數(shù)據(jù)類型。
整型的內(nèi)部表示
整型內(nèi)部的位表示使用的是純二進(jìn)制計(jì)數(shù)法
(pure binary numeration system)。但對(duì)于構(gòu)成整型的位序列的解釋,無符號(hào)類型
和有符號(hào)類型
是完全不同的。
無符號(hào)整數(shù)的內(nèi)部表示
無符號(hào)整數(shù)的數(shù)值在計(jì)算機(jī)內(nèi)部是以二進(jìn)制數(shù)
來表示的,該二進(jìn)制數(shù)與各二進(jìn)制位一一對(duì)應(yīng)。例如十進(jìn)制數(shù)25用二進(jìn)制數(shù)表示如下:
25用二進(jìn)制數(shù)表示是11001,高位補(bǔ)0后表示為0000000000011001。
以16位為例,無符號(hào)整數(shù)的最小值為0,即0000 0000 0000 0000,最大值為65535,即1111 1111 1111 1111。
有符號(hào)整數(shù)的內(nèi)部表示
當(dāng)存儲(chǔ)有符號(hào)數(shù)時(shí),最高位為符號(hào)位(1表示負(fù)數(shù),0表示非負(fù)數(shù)),其余位是數(shù)據(jù)位。
計(jì)算機(jī)中有符號(hào)整數(shù)的存儲(chǔ)是以補(bǔ)碼形式存儲(chǔ)的。
一個(gè)整數(shù)有以下三種編碼。
1.原碼
十進(jìn)制整數(shù)數(shù)碼化為原碼的方法是首先把十進(jìn)制整數(shù)轉(zhuǎn)換為二進(jìn)制,然后在高位用0補(bǔ)足15位,最后添上符號(hào)位。
2.反碼
對(duì)整數(shù)而言,原碼即為反碼,對(duì)負(fù)數(shù)而言,反碼是將原碼中除符號(hào)位之外的其余位依次取反。
3.補(bǔ)碼
對(duì)整數(shù)而言,原碼即為補(bǔ)碼。對(duì)負(fù)數(shù)而言,補(bǔ)碼是在反碼的基礎(chǔ)上加1。在求補(bǔ)碼的過程中,符號(hào)位不發(fā)生變化,當(dāng)數(shù)據(jù)的最高位有進(jìn)位時(shí),舍棄進(jìn)位。
補(bǔ)碼的運(yùn)算法則如下:
位運(yùn)算
位運(yùn)算符
C語言提供了六種運(yùn)算符:
&
位與運(yùn)算符|
位或運(yùn)算符^
位異或運(yùn)算符~
位取反運(yùn)算符(單目運(yùn)算符)<<
位左移運(yùn)算符>>
位右移運(yùn)算符
注意,位運(yùn)算的對(duì)象只能是整型和字符型,不能是浮點(diǎn)型數(shù)據(jù)。運(yùn)算結(jié)果是整形數(shù)據(jù)。
位與運(yùn)算
&
運(yùn)算的含義是對(duì)參與運(yùn)算的兩個(gè)運(yùn)算對(duì)象的機(jī)器碼按二進(jìn)制方式對(duì)相應(yīng)位進(jìn)行位與運(yùn)算,當(dāng)兩個(gè)相應(yīng)位都為1時(shí),運(yùn)算結(jié)果的相應(yīng)位也為1;否則,運(yùn)算結(jié)果的相應(yīng)位為0。
位或運(yùn)算
|
運(yùn)算的含義是對(duì)參與運(yùn)算的兩個(gè)運(yùn)算對(duì)象的機(jī)器碼按二進(jìn)制方式對(duì)相應(yīng)位進(jìn)行位或運(yùn)算,當(dāng)兩個(gè)相應(yīng)位都為0時(shí),運(yùn)算結(jié)果的相應(yīng)位也為0,否則運(yùn)算結(jié)果的相應(yīng)位為1。
位異或運(yùn)算
^
運(yùn)算的含義是對(duì)參與運(yùn)算的兩個(gè)運(yùn)算對(duì)象的機(jī)器碼按二進(jìn)制方式對(duì)相應(yīng)位進(jìn)行位異或運(yùn)算,當(dāng)兩個(gè)相應(yīng)位相同時(shí),運(yùn)算結(jié)果的相應(yīng)位為0,否則運(yùn)算結(jié)果的相應(yīng)位為1。
位取反運(yùn)算
~
運(yùn)算的含義是對(duì)參與運(yùn)算的運(yùn)算對(duì)象的機(jī)器碼按二進(jìn)制方式對(duì)相應(yīng)位進(jìn)行位取反運(yùn)算,1變0,0變1。
注: &
|
和~
運(yùn)算符的功能和&&
||
和 !
運(yùn)算符功能相似,但要注意它們的區(qū)別。
&&
||
和 !
會(huì)根據(jù)非零為真,零為假的運(yùn)算規(guī)則對(duì)操作數(shù)進(jìn)行邏輯運(yùn)算。
&
|
和~
會(huì)根據(jù)1為真,0為假的運(yùn)算規(guī)則對(duì)操作數(shù)的二進(jìn)制位進(jìn)行邏輯運(yùn)算。
例如:
表達(dá)式 3 & -1
的值計(jì)算如下:
而表達(dá)式 3 && -1
的值為1.
位左移運(yùn)算符
<<
運(yùn)算的含義是對(duì)參與運(yùn)算的運(yùn)算對(duì)象的機(jī)器碼按規(guī)定的移位數(shù)進(jìn)行左移。<<
運(yùn)算符構(gòu)成的表達(dá)式一般格式為a<<n
,其中a是需要移位的數(shù)據(jù),n是移位的位數(shù)。在移位的過程中,高位移除的位舍棄,低位左移后補(bǔ)0。
例如:
表達(dá)式a<<1的運(yùn)算如下:(a=3)
這里需要注意的是,a<<1后,a的值不變。
以上述為例,通過左移a<<1的值為6,是原來的2倍。其實(shí)不難理解,以十進(jìn)指數(shù)為例,假如將198進(jìn)行左移,低位補(bǔ)0后,變成了1980,是原來的10倍。而在二進(jìn)制中,若向左移動(dòng)n位,那么a<<n就會(huì)變成原來的2的n次方。
位右移運(yùn)算符
>>
運(yùn)算的含義是對(duì)參與運(yùn)算的運(yùn)算對(duì)象的機(jī)器碼按規(guī)定的移位數(shù)進(jìn)行右移。>>
運(yùn)算符構(gòu)成的表達(dá)式一般格式為a>>n
,其中a是需要移位的數(shù)據(jù),n是移位的位數(shù)。
例如:
表達(dá)式a>>1(a=3)的運(yùn)算如下:
同樣的,a>>1后,a的值不變。
通過右移,a>>1的值變?yōu)樵瓉淼亩种?。在二進(jìn)制中,若向右移動(dòng)n位,則會(huì)變?yōu)?的n次方分之一。(不一定是恰好是整數(shù)倍,可能會(huì)有余數(shù),但是商的結(jié)果是。)
邏輯位移與算術(shù)位移
對(duì)于右位移運(yùn)算,可以分為兩種,邏輯位移和算術(shù)位移。
邏輯位移
邏輯移位不考慮符號(hào)位,所有二進(jìn)制位都進(jìn)行位移。(包含符號(hào)位在內(nèi)的所有位都進(jìn)行位移)
這樣對(duì)于負(fù)數(shù)而言,進(jìn)行右位移運(yùn)算后,會(huì)變成非負(fù)數(shù)。
例b>>4(b=-16)
位移為-16,進(jìn)行位移運(yùn)算,b>>4的值為2的12次-1。
算術(shù)位移
算術(shù)位移會(huì)保留最高位的符號(hào)位,只對(duì)除了符號(hào)位之外的其他位進(jìn)行位移。
對(duì)于位移之后的空位用符號(hào)位的值進(jìn)行填充。位移前后的符號(hào)不變,即負(fù)數(shù)還是負(fù)數(shù),正數(shù)還是非負(fù)數(shù)。
以上述b>>4(b=16)為例
b>>4的值為-1。
以上就是詳細(xì)講解C語言中的數(shù)據(jù)以及位運(yùn)算的詳細(xì)內(nèi)容,更多關(guān)于C語言位運(yùn)算的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
常用的C++標(biāo)準(zhǔn)庫頭文件小結(jié)
C++標(biāo)準(zhǔn)庫定義了一系列函數(shù)、宏和對(duì)象,以實(shí)現(xiàn)跨團(tuán)隊(duì)、跨平臺(tái)的高效且具有卓越性能的標(biāo)準(zhǔn)化 C++ 代碼, 本文介紹常用的C++標(biāo)準(zhǔn)庫頭文件,需要的朋友可以參考下2023-11-11C++ 項(xiàng)目引入lib和dll的區(qū)別與使用實(shí)戰(zhàn)
靜態(tài)鏈接庫與動(dòng)態(tài)鏈接庫都是共享代碼的方式,本文主要介紹了C++項(xiàng)目引入lib和dll的區(qū)別與使用實(shí)戰(zhàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02C語言學(xué)生信息管理系統(tǒng)小項(xiàng)目
這篇文章主要為大家詳細(xì)介紹了C語言學(xué)生信息管理系統(tǒng)小項(xiàng)目,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01c++結(jié)合opencv如何實(shí)現(xiàn)讀取多張圖片并顯示
這篇文章主要介紹了c++結(jié)合opencv如何實(shí)現(xiàn)讀取多張圖片并顯示問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11