![](/img/trans.png)
[英]conversion from '::size_t' to 'int' requires a narrowing conversion
[英]Why is int -> size_t a narrowing conversion?
考慮這段代碼:
#include <cstddef>
#include <cstdint>
int main()
{
uint16_t z{1};
uint16_t x{2};
size_t y{x << z};
return (int)y;
}
此代碼在 GCC、Clang 和 MSVC 上生成消息,表示size_t y{x << z}
是縮小轉換。 (GCC 上的警告,其他兩個上的錯誤)。
根據 GCC 的警告消息, x
和z
正在被提升為 int。 好的,這是有道理的。
我不明白的是從int
到size_t
的轉換是如何“縮小”轉換的,因為size_t
大於int
。
有趣的是,至少對我來說,如果我將x
的定義更改為uint32_t x{2}
,代碼編譯沒有問題。
盡管int
和size_t
可能是相同的位寬,但它們的不同之處在於int
是一個帶符號的值,因此它的范圍(例如 16 位)將是 [-32768..+32767] 而相同的假設 16-位size_t
將在 [0..65535] 范圍內。 從有符號值到無符號值的轉換被報告為“縮小”。
修復(在這種情況下)基於您的值確實是無符號的知識,因此您可以通過顯式轉換“告訴”編譯器:
auto y{static_cast<size_t>(x << z)};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.