【问题标题】:C program Printf function showing unusual behavior for unsigned long long type?C 程序 Printf 函数显示 unsigned long long 类型的异常行为?
【发布时间】:2015-09-04 11:14:30
【问题描述】:

请考虑下面的程序并观察输出。

#include <stdio.h>
int main()
{
    unsigned long long val ;
    val =144111444250;
    printf ("%llu\n", val);
    printf ("%u %llu\n",val, val);
    return 0;
}

输出:

   144111444250

   33 10211385600662044705

在第一个 printf 中使用 %llu 会得到正确的结果,但在第二个 printf 中使用 %llu 会得到错误的结果。

【问题讨论】:

  • 您的编译器应该警告您将 %ulong long unsigned 类型一起使用。
  • %u 仅从堆栈中弹出val 的一部分。之后,%llu 弹出sizeof(unsigned long long) 字节,其中包括第一次尝试打印val 的其余部分。将 %u 替换为 %llu 时,您的程序应该可以正常工作。
  • 您使用了无效的说明符并得到了无效的结果。谁感到惊讶?
  • @BoPersson:在第一个 printf 中使用 %llu 会给出正确的结果,但在第二个 printf 中使用 %llu 会给出错误的结果。这就是我的问题所在
  • @SHAAN - 但这是错误的第一种格式%u。就像答案已经说过的那样 - 一旦出现问题,其他一切也可能出现问题。

标签: c unix printf solaris


【解决方案1】:

这是未定义的行为printf 期望为 %u 提供一个 unsigned int,但您提供了一个 unsigned long long int,之后发生的任何事情都取决于编译器的奇思妙想。

printfscanf 的格式说明符不仅指示应如何打印/扫描某些内容,还指示期望的参数类型。如果你撒谎,你就不能期望结果是合理的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-31
    • 2016-07-29
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 2011-04-23
    • 1970-01-01
    相关资源
    最近更新 更多