(1)問:如果我給一個(gè)int整形賦值0xFFFF,我得到一個(gè)信息"arithmetic overflow in constant expression"(常數(shù)表達(dá)式里算術(shù)溢出)。為什么編譯器不是把它當(dāng)做-1呢?
答:作為一個(gè)int整形,這個(gè)變量值的范圍只能是從-32768到32767。0xFFFF的值是等于65535,所以太大了。如果你確實(shí)不想使用有符號(hào)的值,可以使用unsigned int,或者直接使用-1或者~0。
一般來(lái)說,如果你想要一個(gè)所有位都為1的值,并且你不想指定它總共有多少位的話,使用~0是個(gè)好的選擇,例如:
OnLimit = ~0;
它將分配一個(gè)所有位都為1的值給這個(gè)變量,對(duì)于16位的int,這個(gè)值是0xFFFF(或-1)。
下面這個(gè)宏
#define ALL_BITS_SET (~0)
也可以很有用處。
(2)問:下面這些定義
#define XTAL 8000000
#define BEEP_FREQ 3200
#define BEEP_TIME XTAL/(64*BEEP_FREQ)-1 // = 38.0625
當(dāng)我把BEEP_TIME賦給一個(gè)unsigned char時(shí),上面這些也會(huì)給我"arithmetic overflow"的信息,而這個(gè)表達(dá)式計(jì)算的結(jié)果肯定是符合unsigned char的大小的。這究竟是怎么回事?
答:你需要確保在整個(gè)算術(shù)表達(dá)式里都是使用long型計(jì)算的。8000000是會(huì)自動(dòng)地變成long型數(shù)據(jù),但是3200和64并不是,所以64*3200是被編譯器評(píng)估為int型的長(zhǎng)度,于是就發(fā)生算術(shù)溢出。使用一個(gè)'L'后綴可以強(qiáng)制為long型計(jì)算,例如:
#define BEEP_TIME XTAL/(64L*BEEP_FREQ)-1 // = 38.0625
注意這個(gè)'L'是附在64上——這使得它變成一個(gè)long型數(shù)據(jù),然后64L*3200被評(píng)估下來(lái)就會(huì)按照32位長(zhǎng)度來(lái)計(jì)算。
-
編輯器
+關(guān)注
關(guān)注
1文章
805瀏覽量
31163 -
算術(shù)
+關(guān)注
關(guān)注
0文章
12瀏覽量
7372
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論