C语言:加法/乘法运算时超过4字节时,需要对运算的数据进行强制转换,不然会丢数据

8 篇文章 0 订阅
6 篇文章 0 订阅

1、发现问题

         平台1:win64位系统,win32程序,正常运行

         平台2:linux32位系统,linux32程序,数据丢失

1.1、获取ms级别时间戳时,同样的函数接口windows32的程序运行ok,数据也正常,在linux平台上则无法正常使用,且数据只有低4字节的数据,如下:

        原始数据:1594795490627

        丢失后的数据:1362623811

{
        struct timeval stTimeValue;
        uint64_t ulUTC = 0;

	///[jxl|2020年7月15日14:59:31] | 返回从纪元年开始到现在的秒和毫秒
	gettimeofday( &stTimeValue, NULL );  
	ulUTC = 1000*stTimeValue.tv_sec + stTimeValue.tv_usec/1000;
        printf("UTC Time_stamp_ms[%llu]\r\n", *pulUTC);
}

2、探索问题过程

2.1、原本以为是格式化输出的问题,查询man手册,查看glibc的源码,我当前的输出没有毛病%llu

2.2、通过赋值常量 uint64_t ulTestValue = 1594793470857;测试程序如下:

{
    uint64_t ulTestValue = 1594793470857;  

    printf("ulTestValue  [%llu] \r\n", ulTestValue );
}

        输出的结果为: ulTestValue  [1594793470857] 说明:%llu的输出是没有问题,问题在运算赋值部分

3、验证猜测

3.1、增加强制转换,代码如下:

{
        struct timeval stTimeValue;
        uint64_t ulUTC = 0;

	///[jxl|2020年7月15日14:59:31] | 返回从纪元年开始到现在的秒和毫秒
	gettimeofday( &stTimeValue, NULL );  
	ulUTC = (uint64_t)1000*stTimeValue.tv_sec + (uint64_t)stTimeValue.tv_usec/1000;
        printf("UTC Time_stamp_ms[%llu]\r\n", *pulUTC);
}

         输出的结果为: UTC Time_stamp_ms[ 1594796213137 ],数据正常未丢失。

4、结论:

         在当赋值结果的存储为64bit时,为了确保数据完整性,请强制转换成64位的变量进行运算

         备注:曾经在什么地方看到过,算术运算若在32位系统上运算时默认参与运算的是32位的数据,对于超过32位的计算结果要强制转换成64位变量,否则容易丢数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值