【问题标题】:long int argument != long int parameterlong int 参数!= long int 参数
【发布时间】:2018-05-10 01:37:14
【问题描述】:

将 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 之前,值会发生变化。

【问题讨论】:

  • printf("%d\n", (int)sizeof(long int)); 在您的平台上的结果是什么?
  • 您是否启用了警告?
  • 另外值得注意的是,如果n1long intprintf("%d\n", n1); 是错误的。
  • 使用long long int%lld 作为格式说明符。
  • 警告已启用,没有警报。

标签: c int printf long-integer


【解决方案1】:

十进制数 1113355579999 太大而无法容纳 32 位整数,这是 long int 类型的常见大小,实际上是 is the size of long long int in your MSVC environment。在提供 32 位 long ints 的 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 在 cmets 中观察到的,该函数的原型必须在调用它的点的范围内。就是这样……

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我正在使用 Visual Studio,如何确保我的 C99 编译器确实在执行?
    • 不幸的是,较旧的 Visual C 主要是 C89 编译器,添加了一些 C99 特性,以及一些非标准特性;不过,自 MSVC2015 以来,这似乎有所改善:msdn.microsoft.com/en-us/library/…
    • 所以本质上问题出在我的编译器上?需要 C99 吗?
    • 好吧,问题在于假设和实现之间的不匹配。如果您需要 64 位整数,请检查您是否有 (Visual Studio 2010 及更高版本有)。在该标头中定义了 uint64_t 和各种其他保证大小类型。请注意,有一些特殊的宏用于打印来自stdint.h 的类型,不过。 Google 如何使用“PRIx64”或查看stackoverflow.com/questions/32112497/… 示例。
    • @ArielGliksberg,虽然 MSVC2015 没有提供完全符合 C99(甚至 C89)的编译器,但我很确定它确实有足够大的 long long int。我不是 Visual Studio 的 C 编译器的忠实拥护者,但我认为这不是您的特定问题的原因。
    【解决方案3】:

    1113355579999 太大,无法放入您平台的长整数中。

    【讨论】:

    • “你的平台”是什么意思,我能用它做什么?
    • 您的平台是您的计算机、操作系统和编译器,以及库。如果您使用的是 Visual Studio,long long int 应该足够大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 1970-01-01
    相关资源
    最近更新 更多