C语言高级编程:如何确定一个变量是有符号还是无符号数
?
ANSI C中的整型升級:
1)char,short int或者int型位段(bit-field),包括它們的有符號或無符號變型,
2)以及枚舉類型,可以使用在需要int或unsigned int的表達式中,
3)如果int可以完整地表示源類型的所有值,那么該類型的值就轉換為int,否則轉換為unsigned int。
?
ANSI C中的尋常算術轉換:
1)當執行算術運算時,操作數的類型如果不同,就會發生轉換。
2)數據類型一般朝著浮點精度更高、長度更長的方向轉換,
3)整型數如果轉換為signed不會丟失信息,就轉換為signed,否則就轉換為unsigned。
4)這個稱為值保留(value preserving)原則。
?
1. 代碼:
#include <stdio.h>#define IS_UNSIGNED(a) (a >= 0 && ~a >= 0)int main() {signed int a;unsigned int b;signed char c;unsigned char d;printf("a=%d, b=%d\n", IS_UNSIGNED(a), IS_UNSIGNED(b));printf("c=%d, d=%d\n", IS_UNSIGNED(c), IS_UNSIGNED(d)); }?
2. 運行
D:\baoli\Desktop
λ .\a.exe
a=0, b=1
c=0, d=0
?
?
3. 分析
1)對于int型變量,可以使用
2)對弈char或short型變量,不適用
無論原先是否有符號,在~a >= 0中,char和short都被轉換成了signed int(整型升級),然后再進行取反。
同時,常數0被認為是int(即signed?int)類型,所以一律被判為有符號數了。
?
?
4. 改進
#define IS_UNSIGNED(a) ((a |= (0x1 << (sizeof(a)*8 - 1))) > 0 ? 1 : 0)
把變量的最高位置1,然后判斷變量是否大于0。如果大于0,就是無符號數;否則就是有符號數。
?
5. 結果
D:\baoli\Desktop
λ .\a.exe
a=0, b=1
c=0, d=1
?
總結
以上是生活随笔為你收集整理的C语言高级编程:如何确定一个变量是有符号还是无符号数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何删除windows service(
- 下一篇: etcd参数详解