long int参数!= long int参数

时间:2017-11-26 19:51:44

标签: c int printf long-integer

当传递1113355579999作为参数时,该值在函数内部更改为959050335。

呼叫(main.c中):

printf("%d\n", FindCommonDigit(1113355579999, 123457));

功能(ex4.c):

int FindCommonDigit(long int n1, long int n2) { printf("%d\n", n1); }

有什么问题? 值得一提的是,在进入printf之前,价值会发生变化。

3 个答案:

答案 0 :(得分:6)

十进制数1113355579999太大,无法容纳32位整数,这是long int类型的常见大小,实际上是is the size of long long int in your MSVC environment。在提供32位long int的C实现上,该常量的类型为long long int

您可以将long long int传递给long int类型的参数,但如果该值对于long int来说太大,则生成的行为是实现定义的。可能保留最不重要的32位,在您的特定数字的情况下,将导致数字959050335(看起来很熟悉?)。要在不失去保真度的情况下将参数传递给函数,函数参数必须具有可以容纳参数的类型。在符合要求的C实现中,long long int就足够了。

正确接收到该参数后,该函数还必须正确地将其呈现给printf(),否则行为是未定义的。以小数表示的long long int格式指令为%lld

把它放在一起,你似乎想要这个:

int FindCommonDigit(long long int n1, long long int n2) {
    printf("%lld\n", n1);

    return /* ... something ... */;
}

需要函数返回int,否则行为再次未定义。

此外,正如@pmg在注释中观察到的那样,该函数的原型必须在调用它的范围内。那就是这个......

int FindCommonDigit(long long int n1, long long int n2);

...靠近使用该函数的源文件的顶部(即main.c)。如果您愿意,可以将其直接放入文件中,但您应该考虑将原型放入头文件中#include。如果该函数将用于多个源文件,后者特别有用。

答案 1 :(得分:2)

请注意,只有long long int才能保证足够大,以存储该计算的结果(或者,实际上,您正在使用的输入值)。

您还需要确保在C99兼容模式下使用编译器(例如,使用gcc的-std=gnu99选项)。这是因为直到C99才引入long long int类型

答案 2 :(得分:-1)

1113355579999太大,无法适应您平台的长期内容。