簡體   English   中英

在C ++中使用限制和非常大的數字的問題

[英]Problem with using limits and very large numbers in C++

這是第三次或第四次遇到此問題,這讓我很煩,因為對於初學者來說,這對我來說毫無意義。

因此,對於我的班級,我必須編寫一個程序(程序中的函數),該程序將查找數字中的最大和最小數字並將數字計數返回為變量。 我討厭使用引用,但是那不是現在的重點。

我的程序運行良好,正如預期的那樣,直到嘗試將最大的long long int數字發送給該函數之前,都不會發生任何不良情況。

因為我的函數中不需要負數,所以我使用了if語句來檢查數字是否小於0,如果是,則應將其乘以-1以獲得正數(我知道我可以使用abs函數但結果相同)。

當我傳遞最大的long long int值即-9,223,372,036,854,775,807時,程序返回該數字小於0,但還返回一個負數,而不是正數,但是當我測試−9,223,372,036,854,775,807時,該數字-1再次起作用。

所以我的問題是這里實際上發生了什么,為什么n * =-1部分被忽略,是因為數字正在使用所有的內存還是?

int Digits(long long int n,int &c_min,int &c_max){

    c_min=9;
    c_max=0;

    if(n<0){
        n*=-1;
    }

    int digit;
    int numberOfDigits(0);

    while(n!=0){
        digit=n%10;
        if(digit > c_max) c_max=digit;
        if(digit< c_min) c_min=digit;
        numberOfDigits++;
        n/=10;
    }



    if(numberOfDigits==0){
        c_min=0;
        c_max=0;
        return 1;
    }

    return numberOfDigits;
}

主功能 :

int main ()
{
    int mini,maxi;
    int e = Digits(std::numeric_limits<long long int>::min(), mini, maxi);

    std::cout << e;

    return 0;
}

想象一下,您的數字有4位,這意味着您可以存儲2 ^ 4個數字(即16)。現在,由於您需要正數和負數,因此您可能希望將其分成兩半,並有8個正數和8個負數。 但是您還需要零,這意味着除零外,您還有15個數字。 發生的情況是您有從-8到正7的數字,也就是16個數字:

-8 -7 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 6 7

現在,您可以看到4位中的正數不能為8。 在這種情況下, 最大的負數沒有對應的正值,因此與-1的乘積溢出並保持負數。 溢出實際上會導致未定義的行為,這意味着您無需再進行檢查。

我認為這可能是原因。 abs(min())返回的值比某種類型的max()大1。

對於32位int, min() returns -2^31, while max returns 2^31 - 1對於64位long long int,

min() returns -2^63 while max() returns 2^63 - 1

因此,當您執行an = n * -1時,它不會保存該數字,因為它會溢出。

因此,您可以測試的最小值為min()+ 1

順便說一句,這樣做的效率更高

n = -n
instead of 
n = n * -1

暫無
暫無

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

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