Arithmetic overflow(算术溢出)信息是什么意思

(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位长度来计算。

LED大屏幕户外安装要求
BAT抢占智能家庭市场入口,打造自家生态系统
24v升压电路图汇总大全(五款模拟电路设计原理图详解)
采用磁阻传感器测量工具实现弹体滚转角测量系统的应用设计
基于氨基的D-A结构助力CO2转化为CH4
Arithmetic overflow(算术溢出)信息是什么意思
三星:推出新型Red LED封装产品之后,正式进军园艺LED元件领域
pixel手机遭遇黄牛党 谷歌对其宣判“数字死刑”令外界震惊
苹果ar头显有什么功能
Adobe已经确定即将为苹果开发iPad版Illustrator
更适合女生使用的智能化妆镜,它到底有多厉害
硅谷数模:IoT、AI将推动全球模拟IC市场持续增长
地平线推出首款嵌入式AI芯片要发力无人驾驶与智能安防
温度开关KSD301
NB-IoT之后,eMTC成蜂窝物联网的第二张牌
推荐3个非常不错的开源日志库
超千亿投资后,传感器产业大军奔涌“海上花园之城”
基于STM32调用固件库实现点灯
微软Xbox Scarlett将在2020年登场
小米MIUI9发布会在即:MIUI9已经开始内测,支持哪些机型?MIUI9适配机型一览,适配范围超广