本文目錄一覽:
- 1、求c語言中各個語句如int,float,scanf的用法和區別?
- 2、c語言有符號int取值範圍
- 3、為什麼在 c語言中,int 有個範圍,這個範圍怎麼計算的?
- 4、為什麼C語言里有的數據類型的值域會不同?
- 5、C語言的int類型變數範圍是多少?
- 6、c語言中int取值範圍為16位指的是什麼16位
求c語言中各個語句如int,float,scanf的用法和區別?
int為整形變數佔2個位元組,共16位,值域為-32768~32767
char為字元型變數例如’a’,’b’等,存儲時是存儲的ascii碼,ascii碼是8位,所以char只需一個位元組
例如’a’為01100001,一個位元組就可以存8位
float為單精度實型,佔4位元組,可放32位二進位數,而且可以是小數,值域為-3.4e+38~3.4e+38
所說的變數其實只是一段內存空間,例如定義了int
a;則開闢了2個位元組的內存空間,char
a;則開闢1個位元組內存空間,float
a;則開闢4個位元組內存空間。
printf函數是把變數的值輸出在屏幕上;
scanf函數是從鍵盤上輸入的值賦給變數。
c語言有符號int取值範圍
結論,取值範圍是-2^31~2^31-1(十六進位為0x80000000~0x7fffffff)。因為0既不是正數也不是負數,+0是0,-0是最小的負數(-最大正數-1),所以負數的取值範圍比正數多一個數。
int為四個位元組,一共32位,其中最高位為符號位,0表示正數,1表示負數,剩下的31位表示數。所以一共可表示2*2^31即2^32個數字(包括一個0)。
在計算機中保存有符號數,保存的是數的二進位的補碼,正數的源碼、反碼、補碼相同,負數的反碼為源碼除符號位之外其餘位取反,補碼為反碼+1(符號位不參與這個運算)。
在計算機中,正數為常量,且源碼和補碼相同,所以存儲正數直接存就行。而負數因為有一個負號-,所以負數是一個計算表達式,都是由負數的絕對值計算出該負數的補碼後存儲在計算機中的。
求負數的補碼值的時候,如-5,首先確定其符號位是1,後面寫出其絕對值的二進位形式,28個0後面跟101,反碼為29個1後面跟010,再加1就是補碼29個1後面跟011,那麼-5在計算機中就是存為29個1後面跟011。
所以可知0是32個0,最大正整數為0後面31個1,即2^31-1(2^31個數里包含了0,所以正數的個數要減去一個)。按理說正負數應該是對稱的,最小的負數應該是-最大正整數,即-(2^31-1),為什麼實際上最小的負數為 -最大正整數-1?為什麼-0是最小的負數?
注意,雖然 -最大正整數-1 就是 -(2^31-1)-1 = -2^31,但是寫的時候不能寫 int i = -2^31;因為說了負數其實是一個計算表達式,實際上是先對正數取反然後加1,符號位置為1,但是正數最大值是2^31-1,所以寫-2^31是溢出的,這涉及到另外一個知識點。
先解釋為什麼-0是最小的負數(負的最大正整數-1)。
負的最大正整數的源碼:32個1。反碼:1後面跟31個0。補碼:左右各1個1,中間30個0。所以,負的最大正整數(-(2^31-1))在計算機中存儲為:1三十個零1。負的最大正整數-1就是負的最大正整數加-1。-1的補碼為:32個1(十六進位為0xffffffff),那麼兩個補碼相加:1三十個零1 + 32個1 = 1三十一個零。所以 負的最大正整數減一 的補碼為:1三十一個零(十六進位為0x80000000),那麼可以推斷出其反碼是32個1,則源碼是1三十一個零,即-0,所以-0就是 負的最大正整數減一 ,-0的源碼和補碼相同。
那麼為什麼最小的負數是 負的最大正整數-1,為什麼不能是負的最大正整數-2,或者減3……,因為通過計算,負的最大正整數的補碼+負二的補碼=0後面跟三十一個1,變成了最大的正整數。顯然是不對的,同一個補碼只能表達一種含義,減3同理,所以就規定最小的負數為負的最大正整數-1。
為什麼在 c語言中,int 有個範圍,這個範圍怎麼計算的?
int型取值範圍為-32768~32767是針對int型佔2個位元組來說的。
下面具體說明該範圍的求法:
int型佔2個位元組,共16位。
int型能表示的最大正數為(最高位為符號位,正數的符號位為0):0111
1111
1111
1111
也即2^15-1=32767
int型能表示的最小負數為(最高位為符號位,負數的符號位為1):1000
0000
0000
0000(補碼),而在計算機中負數是利用補碼進行存儲的,所以將1000
0000
0000
0000轉換為源碼就是1000
0000
0000
0000,也即-2^15=32768
所以int型取值範圍為-32768~32767
為什麼C語言里有的數據類型的值域會不同?
不同數據類型
占的位元組數不同
導致值域不同,比如
char
佔一位元組,long佔4位元組,自然不可能一樣
還有一種
是數據類型表示數據的方式不同,
比如int是用來表示整型的,而float是用來表示浮點型的,雖然都是4位元組,但表示範圍肯定不一樣的。
C語言的int類型變數範圍是多少?
變數範圍是-32,768 to 32,767 或者 -2,147,483,648
測試int變數的位元組數:
#include stdio.h#include limits.hint main() { printf(“Storage size for int : %d \n”, sizeof(int)); return 0;}
結果:Storage size for int : 4
說明int型變數佔用4個位元組。
printf(“int類型的最大值:%d\n”,INT_MAX); printf(“int類型的最小值:%d\n”,IN。
c語言中int取值範圍為16位指的是什麼16位
1.c語言中int取值範圍為16位指的是什麼16位
計算機用二進位表示數值,最小單位就是位(bit),可以儲存0或1,16位就是有16個儲存0或1的位,其中左邊第一位是符號位,0代表+ 、1代表-。
2.當中16位與-32768~+32767又有什麼關係?
這裡的-32768~+32767是指用16位來儲存一個int值的取值範圍。int是integer(整數)的縮寫,int類型的值必須是整數,可以是正整數,負整數或0。
3.是不是16位指的就是32767用二進位表示時有16位數字
不是,16位表示32767是0111 1111 1111 1111,而0000 0000 0000 0000 0111 1111 1111 1111也表示32767,它有32位。
擴展:關於為什麼16位int值的取值範圍是-32768~+32767。
二進位轉化為十進位,從右往左數,第一位代表2的0次方,第二位是2的1次方,以此類推,用每一位上的數乘以對應位的值再相加即可得到對應的數值。比如1011就等於1*(2^0)+1*(2^1)+0*(2^2)+1*(2^3)=1+2+0+8=11。
那麼計算機表示的16位正數範圍就是從0000 0000 0000 0001到0111 1111 1111 1111。(注意:計算機表示時最左邊是符號位。)
也就是正的1*(2^0)到1*(2^0)+1*(2^1)+1*(2^2)+……+1*(2^14)=(2^15)-1
也就是+1~+32767。
負數範圍要了解計算機內部表示負數的方法,「2的補碼」,具體方法分兩步:
第一步,每一個二進位位都取相反值,0變成1,1變成0。
第二步,將上一步得到的值加1。
比如要表示16位的-1,就把+1也就是0000 0000 0000 0001取反變為1111 1111 1111 1110,再+1,也就是1111 1111 1111 1111表示-1。
那麼要知道計算機表示的一個負數的絕對值就要把這個負數按照上面所說的「2的補碼」規則反處理。所以16位能表示的最小負數,也就是符號位為1,其餘全部為0,即1000 0000 0000 0000。
(這裡比較難理解為什麼確定符號為1,後面要全部取0,主要是為了經過反處理後得到一個盡量大的數值,也就是最左邊位置2^15位上的值為1,這樣才能得到最小的負數。)
第一步,1000 0000 0000 0000(處理時,這是一個二進位數值,1不再是符號) 減去1得到 0111 1111 1111 1111。
第二步,取反,變為1000 0000 0000 0000,即1*2^15。
綜上,16位int取值範圍是1000 0000 0000 0000到0111 1111 1111 1111即-2^15~(2^15)-1,-32768~+32767。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/198222.html