Maz*_*zze 1 c variables unsigned-long-long-int undefined-behavior
在运行为MIPS编译的程序时,我偶然发现了一个非常奇怪的问题.下面的代码片段是获取时间纪元并将其以微秒精度存储在unsigned long long变量中.
该变量能够存储我检查过的8个字节sizeof(unsigned long long).
这段代码打印出来很奇怪:
unsigned long long microtime=0;
struct timeval time_camera = { .tv_sec=0, .tv_usec=0 };
gettimeofday(&time_camera,NULL);
microtime = time_camera.tv_sec * 1000000 + time_camera.tv_usec;
printf("Times is now %llu , time since epoch in seconds is: %lu\n", microtime, time_camera.tv_sec);
Run Code Online (Sandbox Code Playgroud)
它给了我以下输出:
>> Times is now 484305845 , time since epoch in seconds is: 1357751315
Run Code Online (Sandbox Code Playgroud)
但是,当我将计算分解为不同的行时,它才有效!:
unsigned long long microtime=0;
struct timeval time_camera = { .tv_sec=0, .tv_usec=0 };
gettimeofday(&time_camera,NULL);
microtime = time_camera.tv_sec;
microtime = microtime * 1000000;
microtime = microtime + time_camera.tv_usec;
printf("Times is now %llu , time since epoch in seconds is: %lu\n", microtime, time_camera.tv_sec);
Run Code Online (Sandbox Code Playgroud)
输出是:
Times is now 1357751437422143 , time since epoch in seconds is: 1357751437
Run Code Online (Sandbox Code Playgroud)
现在这只是一个巧合吗?例如,我已经损坏了内存或者实际上超过了它吗?也许这是MIPS编译器?任何帮助表示赞赏!
microtime = time_camera.tv_sec * 1000000 + time_camera.tv_usec;
Run Code Online (Sandbox Code Playgroud)
tv_sec是一个较小的整数类型(time_t可能int或long),所以
time_camera.tv_sec * 1000000
Run Code Online (Sandbox Code Playgroud)
溢出.使用后缀为常量提供适当的类型
time_camera.tv_sec * 1000000ULL
Run Code Online (Sandbox Code Playgroud)
在
microtime = time_camera.tv_sec;
microtime = microtime * 1000000;
Run Code Online (Sandbox Code Playgroud)
乘法是在unsigned long long,因为一个操作数(microtime)已经具有该类型,所以另一个转换为该类型.
| 归档时间: |
|
| 查看次数: |
647 次 |
| 最近记录: |