[英]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
,可能是int
或long
),因此
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.