(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
發布評論請先 登錄
相關推薦
評論