(1)問:如果我給一個int整形賦值0xFFFF,我得到一個信息"arithmetic overflow in constant expression"(常數表達式里算術溢出)。為什么編譯器不是把它當做-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
當我把BEEP_TIME賦給一個unsigned char時,上面這些也會給我"arithmetic overflow"的信息,而這個表達式計算的結果肯定是符合unsigned char的大小的。這究竟是怎么回事?
答:你需要確保在整個算術表達式里都是使用long型計算的。8000000是會自動地變成long型數據,但是3200和64并不是,所以64*3200是被編譯器評估為int型的長度,于是就發生算術溢出。使用一個'L'后綴可以強制為long型計算,例如:
#define BEEP_TIME XTAL/(64L*BEEP_FREQ)-1 // = 38.0625
注意這個'L'是附在64上——這使得它變成一個long型數據,然后64L*3200被評估下來就會按照32位長度來計算。
-
編輯器
+關注
關注
1文章
806瀏覽量
31251 -
算術
+關注
關注
0文章
12瀏覽量
7390
發布評論請先 登錄
相關推薦
Embedded Studio堆棧溢出預防功能
當算術運算期間發生除以零或下溢/溢出時,ARM926EJ-S內核的行為是什么?
FPGA基礎學習筆記--組合邏輯電路-算術運算電路
6678:sy***ios創建task時stack 溢出
警告:(751)再次以常量表達式運算溢出
警告:(751)常量表達式中的算術溢出
如何評估HDL代碼的標量以進行算術描述
VHDL Library of Arithmetic Uni
VHDL Library of Arithmetic Uni
80X86指令系統-算術運算指令總結的詳細資料概述免費下載
![80X86指令系統-<b class='flag-5'>算術</b>運算指令總結的詳細資料概述免費下載](https://file.elecfans.com/web1/M00/63/1A/pIYBAFuPg-eAHAYeAADnadGlOFM119.png)
評論