我的代码中有很多#define
个。现在一个奇怪的问题已经出现了。
我有这个:
#define _ImmSign 010100
(我正在尝试模拟二进制数)
显然,我希望这个数字变成10100.但是当我使用这个数字时,它变成了4160.
这里发生了什么?我怎么阻止它?
其他
好的,这是因为语言将其解释为八进制。是否有一些聪明的方法来迫使语言将数字解释为整数?如果前导0定义了八进制,并且0x现在定义为十六进制,我想到它......
答案 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。它们确实处理前导零,但不幸的是你必须选择正确的宏名称,具体取决于你是否有前导零。不完美,但希望有帮助。