C的值意外地定义了变化

时间:2010-04-18 21:18:15

标签: c c-preprocessor

我的代码中有很多#define个。现在一个奇怪的问题已经出现了。

我有这个:

#define _ImmSign    010100

(我正在尝试模拟二进制数)

显然,我希望这个数字变成10100.但是当我使用这个数字时,它变成了4160.

这里发生了什么?我怎么阻止它?

其他

好的,这是因为语言将其解释为八进制。是否有一些聪明的方法来迫使语言将数字解释为整数?如果前导0定义了八进制,并且0x现在定义为十六进制,我想到它......

7 个答案:

答案 0 :(得分:13)

0开头的整数文字被解释为八进制,而不是十进制,就像以0x开头的整数文字被解释为十六进制一样。

删除前导零,你应该好好去。

另请注意,以下划线后跟大写字母或其他下划线的标识符将保留给实现,因此您不应在代码中定义它们。

答案 1 :(得分:4)

将一个整数前缀为0使其成为八进制数而不是十进制数,而八进制中的010100为十进制中的4160.

答案 2 :(得分:2)

C中没有二进制数字语法,至少没有一些编译器扩展。你看到的是010100被解释为八进制(基数为8)的数字:它是在数字文字以0开头时完成的。

答案 3 :(得分:2)

010100被C视为八进制,因为前导0. Octal 10100是4160。

答案 4 :(得分:2)

检查一下它有一些用于在C中使用二进制数的宏 http://www.velocityreviews.com/forums/t318127-using-binary-numbers-in-c.html

还有另一个线程也有这个 Can I use a binary literal in C or C++?

答案 5 :(得分:1)

如果您愿意编写非可移植代码并使用gcc,则可以使用binary constants extension

#define _ImmSign    0b010100

答案 6 :(得分:0)

八月: - )

您可能会发现these macros helpful表示带有十进制或八进制数字的二进制数,形式为1和0。它们确实处理前导零,但不幸的是你必须选择正确的宏名称,具体取决于你是否有前导零。不完美,但希望有帮助。