最近开发一个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