C #define 与 0 [重复]

C #define with 0 [duplicate]

提问人:Mich 提问时间:11/7/2023 更新时间:11/8/2023 访问量:76

问:

我有以下代码:

#define HARDW 671                  // hardware 3 digits
#define FIRMW 013                  // firmware 3 digits
printf("FIRMW %d\r\n", FIRMW);

结果是 11 而不是 13。 你有什么烦恼吗? 如何将定义的字段转换为整数? 注意:我也使用该字段作为字符串,因此我无法删除 0....

此致敬意 密歇根州

C 预处理器

评论

3赞 Vlad from Moscow 11/7/2023
从 0 开始的整数常量是八进制整数常量。所以八进制 013 等于十进制 11。
1赞 Joel 11/7/2023
你可以去掉你的前导,然后使用.这将打印 3 位带前导 s 的数字。请参阅在 c 中打印前导 00#defineprintf("FIRMW %03d\r\n", FIRMW);0
0赞 chepner 11/7/2023
你并不打算让它们成为数字,而是碰巧只包含数字的字符串。不要对此类值使用整数类型。
0赞 Mich 11/7/2023
感谢您的回答,他们解释了原因,但我没有找到任何解决方案,除了在没有 0 的情况下创建一个新定义......
0赞 chux - Reinstate Monica 11/8/2023
尝试和代码将打印 013。OK直到.printf("FIRMW %03o\r\n", FIRMW);FIRMW 018

答:

5赞 ikegami 11/7/2023 #1

前导零使它成为八进制常数,就像前导使它成为十六进制常数一样,前导使它成为二进制常数(从 C23 开始)。0x0b

  • 13产生十三 (1*10+3),int
  • 0x13产生十九 (1*16+3),int
  • 0b11产生三个 (1*2+1) [C23],并且int
  • 013产生 11 (1*8+3)。int