C语言高级编程:如何确定一个变量是有符号还是无符号数
?
ANSI C中的整型升級(jí):
1)char,short int或者int型位段(bit-field),包括它們的有符號(hào)或無(wú)符號(hào)變型,
2)以及枚舉類(lèi)型,可以使用在需要int或unsigned int的表達(dá)式中,
3)如果int可以完整地表示源類(lèi)型的所有值,那么該類(lèi)型的值就轉(zhuǎn)換為int,否則轉(zhuǎn)換為unsigned int。
?
ANSI C中的尋常算術(shù)轉(zhuǎn)換:
1)當(dāng)執(zhí)行算術(shù)運(yùn)算時(shí),操作數(shù)的類(lèi)型如果不同,就會(huì)發(fā)生轉(zhuǎn)換。
2)數(shù)據(jù)類(lèi)型一般朝著浮點(diǎn)精度更高、長(zhǎng)度更長(zhǎng)的方向轉(zhuǎn)換,
3)整型數(shù)如果轉(zhuǎn)換為signed不會(huì)丟失信息,就轉(zhuǎn)換為signed,否則就轉(zhuǎn)換為unsigned。
4)這個(gè)稱(chēng)為值保留(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. 運(yùn)行
D:\baoli\Desktop
λ .\a.exe
a=0, b=1
c=0, d=0
?
?
3. 分析
1)對(duì)于int型變量,可以使用
2)對(duì)弈char或short型變量,不適用
無(wú)論原先是否有符號(hào),在~a >= 0中,char和short都被轉(zhuǎn)換成了signed int(整型升級(jí)),然后再進(jìn)行取反。
同時(shí),常數(shù)0被認(rèn)為是int(即signed?int)類(lèi)型,所以一律被判為有符號(hào)數(shù)了。
?
?
4. 改進(jìn)
#define IS_UNSIGNED(a) ((a |= (0x1 << (sizeof(a)*8 - 1))) > 0 ? 1 : 0)
把變量的最高位置1,然后判斷變量是否大于0。如果大于0,就是無(wú)符號(hào)數(shù);否則就是有符號(hào)數(shù)。
?
5. 結(jié)果
D:\baoli\Desktop
λ .\a.exe
a=0, b=1
c=0, d=1
?
總結(jié)
以上是生活随笔為你收集整理的C语言高级编程:如何确定一个变量是有符号还是无符号数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何删除windows service(
- 下一篇: C语言高级编程:二维数组、指针的指针、数