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