如果我編譯以下代碼
size_t a = -1;
使用帶有 W4 選項的 MSVC 我得到
warning C4245: 'initializing': conversion from 'int' to 'size_t', signed/unsigned mismatch
我不是100%肯定-1是0xFFFFFFFF在所有的平臺上。-1位表示是否由標準定義?
其他選項是:
size_t a = std::numeric_limits<size_t>::max();
size_t a = static_cast<size_t>(-1);
還有其他一些選擇嗎?
它可以是uint8_t,uint16_t等...
在上面的代碼中,我不知道 的實際大小是多少size_t,例如可以是 4 位或 8 位。
uj5u.com熱心網友回復:
要為所有無符號型別設定所有位并使警告靜音,而不進行強制轉換:
a = 1;
a = -a;
或者
a = 0;
a = ~a;
如果您需要 const 或 constexpr 值(并且真的不想使用強制轉換):
constexpr size_t a = [] { size_t a = 0; return ~a; }();
uj5u.com熱心網友回復:
size_t a = -1;
這將初始化a為size_t可以容納的最大值。這是根據模算術而不是位模式定義的。所以無論有符號整數是使用 2s 補碼還是其他東西,這都是正確的。
無符號整數需要直接編碼為它們的二進制表示,因此最大值將始終具有0xFF...FF位模式。
為了讓演員沉默,您的解決方案都可以作業。這只是您使用哪種個人品味的問題。
uj5u.com熱心網友回復:
-1 位表示是否由標準定義?
有符號位表示無關緊要。重要的是標準中如何指定從有符號到無符號的轉換。
將 -1 轉換為無符號整數的結果總是導致無符號型別的最大可表示值。可以安全地假設最大的可表示無符號整數的位表示都是 1。
不能移植到所有系統的假設std::size_t是 64 位寬。a == 0xFFFF在另一個系統上完全可行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/373604.html
標籤:C
上一篇:C 中的警告:指標持有一個值,在嘗試分配新的int32_t時必須檢查該值
下一篇:使用指標演算法計算陣列中的元素數
