c - 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_NUM
203.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,所以应该没有溢出。
解决方案
用#define
另一组括号括起来:
#define BASE_NUM (((int)UCHAR_MAX)+1)
解释:
每当您遇到宏问题时,只需将它们的定义复制粘贴到您使用它们的任何位置,然后从那里进行评估:
printf("%f", 1000.0 / (float) ((int)UCHAR_MAX) + 1);
- 首先,
UCHAR_MAX
被强制转换为 anint
并变为255
。(这里不需要强制转换,因为编译器255
已经将常量视为 anint
)。 - 然后它被强制转换为 a
float
并变为255.0
。 - 然后,因为在 C 中除法优先于加法,
1000.0
所以除以255.0
- finally
1
被转换为浮点数,变为1.0
,并被添加到除法的结果中(1000.0 / 255.0 + 1.0) == 4.92
。
推荐阅读
- scala - Kafka在scala中连接avro消费者
- css - 使用 LazySizes 来延迟加载图像,但在加载时想要保持图像周围的空间
- vba - 用分隔符分隔具有相同值的格式单元格,但在 VBA 中的顺序不同
- spring - Spring webflux安全所有允许的端点返回404
- php - 使用 Stripe Checkout 允许客户购买产品
- node.js - 获取需要当前脚本的脚本位置
- c# - 无法从 Web 配置文件访问文件夹路径
- sql - 在 SQL 中选择不同的值
- python - Pandas 查找具有唯一值的列
- java - 是否有将数字翻转为正数和负数和负数到正数的功能?