(1)問:如果我給一個(gè)int整形賦值0xFFFF,我得到一個(gè)信息"arithmetic overflow in constant expression"(常數(shù)表達(dá)式里算術(shù)溢出)。為什么編譯器不是把它當(dāng)做-1呢?
答:作為一個(gè)int整形,這個(gè)變量值的范圍只能是從-32768到32767。0xFFFF的值是等于65535,所以太大了。如果你確實(shí)不想使用有符號的值,可以使用unsigned int,或者直接使用-1或者~0。
一般來說,如果你想要一個(gè)所有位都為1的值,并且你不想指定它總共有多少位的話,使用~0是個(gè)好的選擇,例如:
OnLimit = ~0;
它將分配一個(gè)所有位都為1的值給這個(gè)變量,對于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是被編譯器評估為int型的長度,于是就發(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被評估下來就會(huì)按照32位長度來計(jì)算。
-
編輯器
+關(guān)注
關(guān)注
1文章
822瀏覽量
32059 -
算術(shù)
+關(guān)注
關(guān)注
0文章
12瀏覽量
7439
發(fā)布評論請先 登錄
Embedded Studio堆棧溢出預(yù)防功能
當(dāng)算術(shù)運(yùn)算期間發(fā)生除以零或下溢/溢出時(shí),ARM926EJ-S內(nèi)核的行為是什么?
FPGA基礎(chǔ)學(xué)習(xí)筆記--組合邏輯電路-算術(shù)運(yùn)算電路
6678:sy***ios創(chuàng)建task時(shí)stack 溢出
警告:(751)再次以常量表達(dá)式運(yùn)算溢出
警告:(751)常量表達(dá)式中的算術(shù)溢出
如何評估HDL代碼的標(biāo)量以進(jìn)行算術(shù)描述
VHDL Library of Arithmetic Uni
VHDL Library of Arithmetic Uni
80X86指令系統(tǒng)-算術(shù)運(yùn)算指令總結(jié)的詳細(xì)資料概述免費(fèi)下載

評論