繁体   English   中英

Unsigned long long在C中表现奇

[英]unsigned long long behaving odd in C

当运行为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);

它给了我以下输出:

>> Times is now 484305845 , time since epoch in seconds is: 1357751315

但是,当我将计算分解为不同的行时,它将起作用!

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);

输出为:

Times is now 1357751437422143 , time since epoch in seconds is: 1357751437

现在这只是一个巧合吗? 例如我是否损坏了内存或实际上超出了某个地方? 也许是MIPS编译器? 任何帮助表示赞赏!

microtime = time_camera.tv_sec * 1000000 + time_camera.tv_usec;

tv_sec是较小的整数类型( time_t ,可能是intlong ),因此

time_camera.tv_sec * 1000000

溢出。 使用后缀为常数赋予适当的类型

time_camera.tv_sec * 1000000ULL

microtime = time_camera.tv_sec;
microtime = microtime * 1000000;

由于一个操作数( microtime )已经具有该类型,所以将以unsigned long long进行乘法,因此另一个会转换为该类型。

看起来您只是在进行size_t数学运算,然后才分配给unsigned long long 尝试在常量后面ULL

另一种方法是(unsigned long long) 1000000 只要在乘法运算中的至少一个操作数上都具有此值,就可以确保结果将是优先级更高的类型。 隐式类型转换优先级规则为(从高到低的顺序):

long double => double => float => unsigned long long => long long => unsigned long => long => unsigned int => int

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM