首页 > 解决方案 > C中的错误常量值

问题描述

我正在尝试使用#define 将 256 作为 C 中的常量。这等于 255 + 1(即 0xff + 1)。因为 in limits.h,UCHAR_MAX是 255,所以 256 应该等于UCHAR_MAX+ 1。所以我写:

#include <limits.h>
#define BASE_NUM ((int)UCHAR_MAX)+1

所以,当我这样做时printf("%f",1000.0/(float)BASE_NUM);,它会打印 4.921569,这是错误的(只有BASE_NUM203.187 才是正确的)。

但是,通过编写printf("%f",1000.0/((float)UCHAR_MAX+1));,我得到 3.906250 作为输出,它确实是正确的。因此,BASE_NUM一定不等于 256,但令人惊讶的是,printf("%d",BASE_NUM);打印出 256,这显然是一个矛盾,BASE_NUM实际上一定不是 256。

我想当我在常量的定义处求和时它与溢出有关,但我真的看不出问题到底是什么,因为我UCHAR_MAX在添加任何东西之前要转换为 int,所以应该没有溢出。

标签: cconstants

解决方案


#define另一组括号括起来:

#define BASE_NUM (((int)UCHAR_MAX)+1)

解释:

每当您遇到宏问题时,只需将它们的定义复制粘贴到您使用它们的任何位置,然后从那里进行评估:

printf("%f", 1000.0 / (float) ((int)UCHAR_MAX) + 1);

  • 首先,UCHAR_MAX被强制转换为 anint并变为255。(这里不需要强制转换,因为编译器255已经将常量视为 an int)。
  • 然后它被强制转换为 afloat并变为255.0
  • 然后,因为在 C 中除法优先于加法,1000.0所以除以255.0
  • finally1被转换为浮点数,变为1.0,并被添加到除法的结果中(1000.0 / 255.0 + 1.0) == 4.92

推荐阅读