【问题标题】:Preprocessor division giving weird value预处理器部门给出奇怪的值
【发布时间】:2020-09-07 08:23:28
【问题描述】:

这快把我逼疯了。我有一个代码在使用除法时输出一个奇怪的值:

#define NANOSECONDS_PER_SECOND   1000000000
uint64 CurrentTimeInNanoSecs; 

    uint64 GetTimeInNanoSecs( )
   {
      printf("\n%X", (CurrentTimeInNanoSecs >> 32) ); 
      printf("\n%X", (CurrentTimeInNanoSecs & 0xFFFFFFFF) ); 
      return ( CurrentTimeInNanoSecs );
   }

void GetCurrentTimeInSecs()
{
  uint32 Time = GetTimeInNanoSecs() / NANOSECONDS_PER_SECOND;
  printf("%X", time);
}

void main()
{
GetCurrentTimeInSecs();
}

在初始化时,我看到打印如下: 0x00000000 0x3016DC6B 0x00000198

我不确定发生了什么。有人可以帮忙吗?

【问题讨论】:

  • 能否请edit 将您的问题包含在minimal reproducible example 中?如果需要,硬编码值,但请尝试确保它确实复制了您遇到的问题(并且还包括您检查值的方式)。
  • 你记得在调用之前声明GetTimeInNanoSecs吗?发布的代码没有显示它。如果不声明它,你应该得到一个警告,当然它不会起作用,因为它会隐式地将返回类型视为int
  • 从这个乱七八糟的伪代码中根本无法分辨出任何东西...请发布有效的 C 代码。
  • 从 C 编译器的角度来看,至少有两个看起来很奇怪的结构。返回值数据类型func(来自不返回任何内容的函数)和奇怪的类似注释的--- this is a...。在这种情况下,回答过于基于猜测和假设。请接受 Somes 的提示并使用 MRE 证明您的问题。
  • 更新了问题。我为之前的乱码道歉

标签: c c-preprocessor integer-division unsigned-integer


【解决方案1】:

注意 printf 格式说明符必须与传递的数据类型一致,否则数据可能会被误解并打印为乱码!

打印 uint64_t 的正确方法是使用 printf("%" PRIu64 "\n", x);,其中 PRIu64 在 inttypes.h 中定义。注意:在 C11 之前,您可能需要定义 __STDC_FORMAT_MACROS 以获取 PRIu64,如 in this SO post 所述。

更一般地,请参阅https://en.cppreference.com/w/cpp/io/c/fprintf 中的表格,了解每个说明符的预期类型。在 Wikipedia 上还有一篇很好的 printf format string 文章。

我建议在打开警告的情况下进行编译。如果使用 clang 或 gcc,请使用命令行选项 -Wall。大多数编译器应该对发布的代码发出警告,例如:
format '%X' expects argument of type 'unsigned int', but argument has type 'uint64_t'

【讨论】:

    【解决方案2】:

    我的错: 我知道我将代码发布为:

    printf("\n%X", (CurrentTimeInNanoSecs >> 32) );
    

    但实际上我是这样写的:

    printf("\n%X", (CurrentTimeInNanoSecs & 0xFFFFFFFF >> 32) );
    

    所以我的高 32 位总是为零,我误解了结果:/

    感谢社区。​​p>

    【讨论】:

    • 当作者对来自 cmets 的问题提供反馈时,SO 效果最佳。您仍然将错误的参数类型传递给printf,并且应该从您的编译器中得到一些警告。
    猜你喜欢
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 2023-03-10
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多