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

Arithmetic overflow(算術(shù)溢出)信息是什么意思
評論