【问题标题】:unsigned long long behaving odd in Cunsigned long long 在C中表现得很奇怪
【发布时间】:2012-12-23 22:39:16
【问题描述】:

在运行为 MIPS 编译的程序时,我偶然发现了一个非常奇怪的问题。 以下代码的 sn-p 是获取时间纪元并将其以微秒精度存储在 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 编译器?任何帮助表示赞赏!

【问题讨论】:

    标签: c variables undefined-behavior unsigned-long-long-int


    【解决方案1】:

    在分配给unsigned long long 之前,您似乎只需要进行size_t 数学运算。尝试在常量后面加上ULL

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

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

    【讨论】:

    • 感谢您发布优先规则!
    【解决方案2】:
    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;
    

    unsigned long long 处执行乘法运算,因为一个操作数 (microtime) 已经具有该类型,因此另一个被转换为该类型。

    【讨论】:

      猜你喜欢
      • 2016-06-28
      • 2011-08-25
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 2011-08-06
      • 2015-08-22
      • 2012-05-26
      • 2021-09-23
      相关资源
      最近更新 更多