0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

麦辣鸡腿堡 来源:Microchip微芯 作者:Microchip微芯 2023-01-22 19:42 次阅读

(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

    文章

    800

    浏览量

    31110
  • 算术
    +关注

    关注

    0

    文章

    12

    浏览量

    7370
收藏 人收藏

    评论

    相关推荐

    Embedded Studio堆栈溢出预防功能

    为了识别运行的嵌入式系统中的堆栈溢出问题,SEGGER编译器通过为每个函数生成检测代码的方式来检查堆栈溢出。该功能可以使用命令行开关-mstack-overflow-check来使能。对于安全系统,必须在
    发表于 07-14 11:08 585次阅读

    算术运算期间发生除以零或下溢/溢出时,ARM926EJ-S内核的行为是什么?

    算术运算期间发生除以零或下溢/溢出时,ARM926EJ-S 内核的行为是什么。 我知道有些架构已经定义了行为,或者可以将其配置为触发中断以响应其中一个算术异常。 该处理器是否具有在运行时检测其中一种情况的功能?
    发表于 02-22 07:35

    FPGA基础学习笔记--组合逻辑电路-算术运算电路

    `FPGA基础学习笔记--组合逻辑电路-算术运算电路+、-、*、/、%电路(1)加法电路:每1位大约消耗1个LE,示例代码如下module arithmetic (input [7:0] iA
    发表于 02-23 16:45

    6678:sy***ios创建task时stack 溢出

    大师们,我遇到关于创建task时stack溢出。其条件如下:设置heapMemPArams.sizee为128MB,位置在DDR3中。在创建几次task后systembios内核就崩溃。打印如下信息
    发表于 06-21 08:43

    警告:(751)再次以常量表达式运算溢出

    您好,我在用PIC18F开发警告时发现这个讨厌的警告:(751)在访问一个比特字段的数据时,在常量表达式中溢出算术。我已经阅读了许多关于这个运算出现的线索,而不是关于移位操作出现的事实。我的代码我
    发表于 09-26 17:24

    警告:(751)常量表达式中的算术溢出

    嗨,那里。当我编译这个项目时,我遇到了这个警告。这里是我的代码:警告显示:困难。C:53:警告:(751)常数表达式中的算术溢出,然后我看了XC8编译器用户指南,并说:这个警告也可以由中间值溢出触发
    发表于 11-20 15:25

    如何评估HDL代码的标量以进行算术描述

    如何评估和计算算术描述的HDL代码标量(可能是伪代码或某些C源代码),以及设计工作量?谢谢。 利达以上来自于谷歌翻译以下为原文How to evaluate and calculate
    发表于 01-10 10:54

    VHDL Library of Arithmetic Uni

    VHDL Library of Arithmetic Units A comprehensive library of arithmetic units written
    发表于 06-14 09:08 26次下载

    VHDL Library of Arithmetic Uni

    VHDL Library of Arithmetic Units fdl A comprehensive library of arithmetic units written
    发表于 06-14 09:09 17次下载

    溢出,溢出的检测方法有哪些?

    溢出,溢出的检测方法有哪些?    在定点小数机器中,数的表示范围为|x|
    发表于 04-13 11:02 1.2w次阅读

    80X86指令系统-算术运算指令总结的详细资料概述免费下载

    算术运算指令(Arithmetic)8086/8088提供加、减、乘、除算术操作; 特点:大部分都影响标志位,不同指令影响不同:(1) 加、减法指令影响 SF,ZF,AF,PF,CF,OF;(2
    发表于 09-05 15:12 0次下载
    80X86指令系统-<b class='flag-5'>算术</b>运算指令总结的详细资料概述免费下载

    如何防止算术运算出现下溢和溢出错误

    。 Solidity支持有符号整数和无符号整数uint,最高可达256位。 这意味着当您的数字超过在分配的存储位之下或之上时,您的算术运算容易出现下溢和溢出错误。
    发表于 07-05 10:59 4474次阅读

    堆栈溢出定义和处理方式

    顾名思义,stack overflow 就是是栈溢出了。在进行数值运算时,我们常常要和运算结果的溢出打交道。数值运算结果可能上溢(overflow),也可能是下溢(underflow)
    的头像 发表于 06-10 16:46 4279次阅读

    java内存溢出排查方法

    Java内存溢出(Memory overflow)是指Java虚拟机(JVM)中的堆内存无法满足对象分配的需求,导致程序抛出OutOfMemoryError异常。内存溢出是Java开发
    的头像 发表于 11-23 14:46 3101次阅读

    内存溢出与内存泄漏:定义、区别与解决方案

    与区别 1. 定义: 内存溢出(Memory Overflow)指的是程序在申请内存时,无法获得足够的内存空间,导致程序抛出异常或崩溃。当程序需要的内存超过了当前可用的内存时,就会发生内存溢出。 2. 区别: 内存
    的头像 发表于 12-19 14:10 2462次阅读