簡體   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