当传递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
之前,价值会发生变化。
答案 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太大,无法适应您平台的长期内容。