溢出警告

来源:互联网 发布:ps二维码源码 编辑:程序博客网 时间:2024/05/16 11:32

       最近开发一个GPS同步FPGA时间的功能,需求是将GPS时间写入到FPGA配置好的32位寄存器中。给的需求是时间精度微秒,范围是0~1小时(但GPS输出时间精度也只有1ms……)。在写入寄存器过程中为了测试60*60*1000*1000微秒是否溢出。写了如下demo。

int main(int argc,char* argv[])

{

    unsigned int value;

    value =60 *60*1000*1000;

    printf("value = %x\n", value);

}

       编译爆出一个警告,如下图所示,但是value值对应的十六进制是0xd693a400并没有超过32位,为什么会有如下警告呢。


       最后在CSDN上查找 到了参考解释,可以作为参考 。我的理解是,编译器,会申请一个变量来存放这个数60*60*1000*1000,且默认是int型变量来存,对于60*60*1000*1000,肯定超过了int型变量的范围,所以给出了警告。因此我们需要做的是告诉编译器用unsigned int或者long long来存储该变量。因此,如下修改就是正确的,没有警告。其实这与编译器有一定的关系,毕竟用什么来存储是与编译器有关的,而编译器又和硬件平台相关,所以有了如下链接所示的讨论。

int main(int argc,char* argv[])

{

    unsigned int value;

    value =60u *60u*1000u*1000u;

    value =60ll*60ll*1000ll*1000ll;

    printf("value = %x\n", value);

}

参考:http://bbs.csdn.net/topics/370186977

0 0