2015-03-02 92 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