簡體   English   中英

為什么負 size_t 下溢但減去它卻沒有?

[英]Why is a negative size_t underflowing but subtracting it does not?

我在這里有一個簡單的程序,它返回 18446744073709551615:

#include <iostream>

using namespace std;

int main()
{
    cout<<-(size_t)1;
    cout<<0-(size_t)1;
    return 0;
}

另外,我這里也有這個程序,它返回預期的結果 0:

#include <iostream>

using namespace std;

int main()
{
    cout<<1-(size_t)1;
    return 0;
}

有人可以向我解釋這里發生了什么嗎? 如果-(size_t)10-(size_t)1下溢,為什么1-(size_t)1

為什么 1-(size_t)1 很好?

因為不會溢出。 1 可表示為std::size_t ,減法結果為 0 也是可表示的。

所以不應該 -(size_t)1 評估為大數字

正如您在第一個示例中使用一元減號運算符時所發現的那樣。 但是您在第二個示例中沒有使用一元減號運算符。 您使用了二進制減號運算符。

那么它會變成1+大數嗎?

減法不會“變成”加法。

也就是說,您會發現1 + std::size_t(-1)也是 0。這是因為無符號算術是模塊化的。 -1 與某個大值一致,而該大值 + 1 與 0 一致。模算術的這種特性被稱為“與平移的兼容性”

暫無
暫無

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

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