簡體   English   中英

為什么 int -> size_t 是縮小轉換?

[英]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 的警告消息, xz正在被提升為 int。 好的,這是有道理的。

我不明白的是從intsize_t的轉換是如何“縮小”轉換的,因為size_t大於int

有趣的是,至少對我來說,如果我將x的定義更改為uint32_t x{2} ,代碼編譯沒有問題。

盡管intsize_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.

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