繁体   English   中英

在uint32_t计算中转换为float

[英]Conversion to float in uint32_t calculation

我正在尝试通过与服务器同步时间来修改秒( 长unsigned n_ticks_per_second )的定义来改进SWRTC。

#include <stdint.h>
#include <stdio.h>

int main(int argc, char * argv[]){

    int32_t total_drift_SEC;
    int32_t drift_per_sec_TICK;
    uint32_t at_update_posix_time = 1491265740;
    uint32_t posix_time = 1491265680;
    uint32_t last_update_posix_time = 1491251330;
    long unsigned n_ticks_per_sec = 1000;

    total_drift_SEC = (posix_time - at_update_posix_time);
    drift_per_sec_TICK = ((float) total_drift_SEC) / (at_update_posix_time - last_update_posix_time);

    n_ticks_per_sec += drift_per_sec_TICK;

    printf("Total drift sec %d\r\n", total_drift_SEC);
    printf("Drift per sec in ticks %d\r\n", drift_per_sec_TICK);
    printf("n_ticks_per_second %lu\r\n", n_ticks_per_sec);

    return 0;

}

我不明白的是,我需要将total_drift_SEC强制转换float ,以便最终获得正确的结果, 即,使end等于n_ticks_per_sec

此代码的输出是:

总漂移秒-60

每秒滴答滴答声0

n_ticks_per_second 1000

而没有强制转换为float的代码的输出为:

总漂移秒-60

每秒滴答滴答度298054

n_ticks_per_second 299054

这条线

drift_per_sec_TICK = total_drift_SEC / (at_update_posix_time - last_update_posix_time);

将32位有signed int除以32位unsigned int

32位unsigned int的等级高于32位signed int等级。

在进行算术运算时,将应用“ 通常的算术转换 ”:

根据C11标准(草稿)6.3.1.8/1

如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则将带符号整数类型的操作数转换为无符号整数类型的操作数的类型。

因此-60被转换为(32位) unsigned int4294967236

这里

drift_per_sec_TICK = (float) total_drift_SEC / (at_update_posix_time - last_update_posix_time);

以下内容适用(根据上述C标准的段落):

如果一个操作数的对应实型为float,则另一个操作数将转换为对应的实型为float的类型,而不会改变类型域。


要避免盲目进入这些陷阱, -Wconversion在使用GCC进行编译时始终指定-Wconversion

因为使用“整数”版本, total_drift_SEC版本将变为unsigned所以-60 > 4294967236

4294967236 / 14410 = 298054

使用浮点除法将计算:

-60/14410 = 0

请参阅第53页的c-标准

6.3.1.8常规算术转换

1许多期望算术类型的操作数的运算符都以类似的方式引起转换和产生结果类型。 目的是确定操作数和结果的通用实型。 对于指定的操作数,在不更改类型域的情况下,将每个操作数转换为其对应的实型为普通实型的类型。 除非另有明确说明,否则普通实型也是结果的相应实型,如果操作数相同,则其类型域为操作数的类型域,否则为复杂。 此模式称为通常的算术转换:[...]否则,将对两个操作数执行整数提升。 然后,将以下规则应用于提升后的操作数:

  • 如果两个操作数具有相同的类型,则无需进一步转换。 否则,如果两个操作数都具有符号整数类型或都具有无符号整数类型,则将具有较小整数转换等级的操作数转换为具有较大等级的操作数的类型。
  • 否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则将带符号整数类型的操作数转换为无符号整数类型的操作数的类型。
  • 否则,如果带符号整数类型的操作数的类型可以表示带无符号整数类型的操作数的所有值,则带无符号整数类型的操作数将转换为带符号整数类型的操作数的类型。
  • 否则,两个操作数都将转换为与带符号整数类型的操作数类型相对应的无符号整数类型。

Ephasis地雷

暂无
暂无

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

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