簡體   English   中英

C++ 為什么在這里將 uint16_t 隱式轉換為 int?

[英]C++ Why is the uint16_t being implicitly cast to int here?

我的代碼中有這一行:

Locus locus({track.chrom, track.begin, LOCUS_TYPE_INNER, it->left, it->right, it->gc / 5, true}) ;

it是一個迭代器,指向以下之一:

struct SimpleKmer {
    uint64_t kmer ;
    uint64_t left ;
    uint64_t right ;
    uint16_t gc ;
};

所有字段均未簽名。 編譯時出現以下錯誤:

warning: narrowing conversion of ‘(int)(((short unsigned int)((int)it.KmerIterator::operator->()->SimpleKmer::gc)) / 5)’ from ‘int’ to ‘uint16_t’ {aka ‘short unsigned int’} inside { } [-Wnarrowing]

這涉及傳遞給Locusit->gc / 5參數。 Locus的相應字段也是uint16_t

我很困惑為什么編譯器在這里進行所有這些隱式轉換。 如果我將表達式更改為it->gc / uint16_t(5)我仍然得到同樣的錯誤,這引發了一個問題,當它們是相同類型時,編譯器為什么將它們強制轉換為整數。

除法運算符是否自動將參數轉換為 int?

除法運算符是否自動將參數轉換為 int?

宣傳,而不是演員,但是是的。 請參閱 cppreference.com 上的隱式轉換:積分促銷

特別是, 算術運算符不接受小於int類型作為參數,並且在左值到右值轉換后自動應用整數提升(如果適用)。 此轉換始終保留該值。

您正在嘗試將it->gc / 5的結果分配給uint16_t字段,這在分配過程中通常不是問題,例如:

uint16_t field;
field = it->gc / 5; // OK

但是,在大括號初始化器內部不允許從較大整數到較小整數的這種縮小轉換:

列表初始化

縮小轉化范圍

列表初始化通過禁止以下內容來限制允許的隱式轉換:

  • ...

  • 從整數或無作用域枚舉類型到不能表示原始所有值的整數類型的轉換,除非源是一個常量表達式,其值可以准確地存儲在目標類型中

  • ...

uint16_t不能表示int所有值,因此出現錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM