2015-03-02 94 views
-4

我已經學習了很長一段時間了。我下載了新的Visual Studio(通常使用Code :: Blocks)來編譯程序。這是我的問題,我寫了一個基本代碼如下:C程序:輸入數字,輸出不同的數字

#include <stdio.h> 
    #include <stdlib.h> 

    int main() 
    { 
     int a; 
     printf("Hello World!\n"); 
     printf("How are you doing?\n"); 
     printf("Put in your ID: "); 
     scanf("%d", &a); 
     printf("Your ID is: %d\n",a); 

     return 0; 
    } 

當我運行它,例如;放入身份證號碼:1234567890, 它顯示1234567890完全一樣。

但是當我把在較長的號碼:12345678900, 這表明3755744308.

我要麼忘記或無法弄清楚什麼是錯的代碼或程序,所以我要問的建議。

謝謝

+3

你說「C」,你標記爲「C++」。哪一個?它看起來更像C而不是C++。 – juanchopanza 2015-03-02 18:25:48

+0

這是C,抱歉誤會 – 2015-03-02 18:26:35

+2

您的號碼太大,無法放入32位(我的假設)整數。 – PaulMcKenzie 2015-03-02 18:27:03

回答

1

int你的情況是4個字節的數據類型。數字12345678900以十六進制表示爲0x2DFDC1C34,可以看出佔用超過4個字節。所以它被截斷爲4個字節0xDFDC1C34,這正好是十進制的3755744308

+0

因此,我需要將「int」更改爲「double」,將%d更改爲%f或%lf以獲得更長的字節? – 2015-03-02 18:30:13

+0

更好地更改爲'長'和'%ld' – 2015-03-02 18:30:36

+0

謝謝你的建議先生... – 2015-03-02 18:33:47

0

你得到了整數溢出。如果輸入的數字不符合int數據類型,則會被截斷爲可能的最大int值。

如果你想輸入非常大的數字,使用unsigned long longlong longunsigned long

(這是C++,不C,但它很容易理解)

#include<iostream> 

#define B_N 1e20 
using namespace std; 

int main() { 
    uint64_t uint; 
    int64_t i64; 
    unsigned long long ull; 
    unsigned long ulong; 
    long long ll; 
    long l; 
    int i; 

    uint=B_N; 
    i64=B_N; 
    ull=B_N; 
    i=B_N; 
    ulong= B_N; 
    ll=B_N; 
    l=B_N; 

    cout<<"uint64_t: "<<uint<<endl; 
    cout<<"int64_t: "<<i64<<endl; 
    cout<<"ull: "<<ull<<endl; 
    cout<<"ulong: "<<ulong<<endl; 
    cout<<"long long: "<<ll<<endl; 
    cout<<"long: "<<l<<endl; 
    cout<<"int: "<<i<<endl; 

    return 0; 
} 

例如,Codepad會告訴你很多溢出的警告。

+1

」..它會被截斷爲最大的int值可能「 - 我(和編譯器)不同意.. – 2015-03-02 18:39:05