簡體   English   中英

將int添加到size_t的正確方法

[英]Proper way to add an int to a size_t

我收到有關以下代碼的Clang警告“隱式轉換更改了簽名”:

size_t x = 10;
int y = -1;
x += y;

x是std :: vector的索引,因此它應該是無符號的long long(也就是size_t)是有意義的,但是y是可以為正或為負的偏移量,因此需要進行簽名。 我可以將y強制轉換為size_t,從而使警告消失並產生正確的結果,但是這似乎不正確,因為強制轉換值肯定不再等於-1了。 那么,是否有適當的方法向size_t添加負數?

這似乎不正確,因為強制轉換值肯定不再等於-1。

至於加法的結果,它不再是-1沒關系。 它仍然與-1模M 1一致 ,因此無符號加法具有正確的結果。

1 M是可表示值的數量。

那么,是否有適當的方法向size_t添加負數?

您可以完全按照示例執行操作。 這是正確的。

如果您想使警告保持啟用狀態,並希望使其靜音,則可以進行顯式轉換。 但這實際上更容易出錯,因為如果您不小心將其轉換為錯誤的無符號類型(可能由於重構而發生),則上述假設不再成立。 因此,還應避免將轉換后的無符號值存儲在中間變量中。 我建議您不要啟用有問題的警告選項。


如注釋中所述,由於您正在使用size_t ,因此您可能要考慮使用ptrdiff_t作為偏移量類型,以便可以將偏移量偏移到任何索引。

更合適的,因為你是索引vector是使用vector::size_typevector::difference_type雖然在實踐中,他們很可能是一樣size_tptrdiff_t

暫無
暫無

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

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