计算char,short,int,long类型变量的取值范围
?????源自《The C Programming Language》P28 pr2-1:
???? 編寫一個程序以確定分別由signed及unsigned限定的char,short,int,long類型變量的取值范圍。
???? 參考代碼:
?????
main.c 1 #include <stdio.h>2 #include <limits.h>
3 #include <float.h>
4
5 int main()
6 {
7
8 printf("the range of char: %d ~ %d\n", SCHAR_MIN, SCHAR_MAX);
9 printf("the min of char: %d\n", -(char)((unsigned char)~0 >> 1));
10
11 return 0;
12 }
???? 分析:
????? 1,? <limits.h>包含了定義char int short long類型取值的最大值和最小值用常量表示(例如SCHAR_MIN = -128)
??????????? 所以直接打印即可。
????? 2,? 如果要自己計算的話,則需要用到按位運(yùn)算符~,>>,對于-(char)((unsigned char)~0 >> 1)解釋:
?????????? a: (unsigned char)~0用二進(jìn)制表示為:11111111
?????????? b: (unsigned char)~0 >> 1,將(unsigned char)~0邏輯右移1位,結(jié)果為:01111111
?????????? c: (char)((unsigned char)~0 >> 1),將((unsigned char)~0 >> 1)由無符號類型強(qiáng)制轉(zhuǎn)換為有符號類型
?????????? d: -(char)((unsigned char)~0 >> 1),得到的二進(jìn)制結(jié)果為11111111,最高位為符號為,對應(yīng)的十進(jìn)制
????????????????? 數(shù)為:-127
??????3,? Q:為什么SCHAR_MIN = -128,而自己通過計算得到的char型變量的最小值為-127呢?
?????????? A:絕大部分機(jī)器采用補(bǔ)碼方式表示有符號整數(shù),
??????????????? [-1]補(bǔ)碼 = 11111111 ?
????????????????-1 取絕對值 1
????????????????? 1 原碼 00000001
??????????????????1 反碼 11111110
????????????????? 反碼+1?11111111
????????????????? 符號位置為1 11111111?<-- -1的補(bǔ)碼
?????????????? 依次類推,[-2]補(bǔ)碼 = 11111110 [-3]補(bǔ)碼 = 11111101 ... [-128]補(bǔ)碼 = 10000000,
?????????????? 故char型最小值為-128。
?????????????? 而自己通過計算得到的-127僅僅是將127取負(fù)作為最小值,其實(shí)在機(jī)器中它應(yīng)該是倒數(shù)第二小值。
轉(zhuǎn)載于:https://www.cnblogs.com/roma823/archive/2011/04/27/2101251.html
總結(jié)
以上是生活随笔為你收集整理的计算char,short,int,long类型变量的取值范围的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式--享元模式实现C++
- 下一篇: b/s c/s结构的区别!