[英]C++ size_t modulus operation with negative operand
因此,模運算可以為您提供三個值:
然后:
-7%5 = 3(數學,余數> = 0)
-7%5 = -2(C ++)
-7%(size_t)5 = 4(C ++)
另一個例子:
-7%4 = 1(數學,余數> = 0)
-7%4 = -3(C ++)
-7%(size_t)4 = 1(C ++)
當左操作數為正時,這三種方法之間的答案都是相同的。 但是對於負值,它們似乎都有自己的方法。 在C ++中如何計算無符號操作數上的模運算值?
當您混合帶符號和無符號的值時,會發生這種情況-混亂!
[C++14: 5.6/2]:
*
和/
的操作數應為算術或無作用域枚舉類型;%
的操作數應具有整數或無作用域的枚舉類型。 通常對操作數執行算術轉換,並確定結果的類型。
現在,請參見下面的粗體部分(假定您的size_t
與您的int
具有相同的等級;這始終是正確的):
[C++14: 5/10]:
許多期望算術或枚舉類型的操作數的二進制運算符都以類似的方式導致轉換並產生結果類型。 目的是產生一個通用類型,它也是結果的類型。 這種模式稱為通常的算術轉換 ,其定義如下:
- 如果兩個操作數都屬於范圍枚舉類型(7.2),則不執行任何轉換。 如果另一個操作數不具有相同的類型,則表達式格式錯誤。
- 如果一個操作數的類型為long double,則另一個應轉換為long double。
- 否則,如果其中一個操作數為double,則另一個應轉換為double。
- 否則,如果其中一個操作數為float,則另一個應轉換為float。
- 否則,應在兩個操作數上執行整數提升(4.5)。61然后,以下規則應應用於提升的操作數:
- 如果兩個操作數具有相同的類型,則無需進一步轉換。
- 否則,如果兩個操作數都具有符號整數類型或都具有無符號整數類型,則整數轉換等級較小的操作數應轉換為等級較大的操作數的類型。
- 否則, 如果具有無符號整數類型的操作數的秩大於或等於另一個操作數的類型的秩,則帶符號整數類型的操作數應轉換為無符號整數類型的操作數的類型。
- 否則,如果帶符號整數類型的操作數的類型可以表示無符號整數類型的操作數的所有值,則應將無符號整數類型的操作數轉換為帶符號整數類型的操作數的類型。
- 否則,兩個操作數均應轉換為與帶符號整數類型的操作數類型相對應的無符號整數類型。
簡而言之,您的-7
變為std::numeric_limit<size_t>::max() + 1 - 7
(無論平台上是什么),並且正在對該值執行計算。 確實, 在我的平台上,這證實了1
的結果 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.