2010-04-18 25 views
6

我的代码中有很多#define。现在一个奇怪的问题已经出现。C的值定义意外变化

我有这样的:

#define _ImmSign 010100 

(我试图模拟一个二进制数)

很显然,我预计的数量成为10100但是,当我使用数字已经变成4160.

这里发生了什么事?我该如何阻止它?

ADDITIONAL

好了,所以这是由于解释本为一个八进制的语言。然而,是否有一些聪明的方法来强制语言将数字解释为整数?如果以0开头定义八进制和0X定义十六进制现在我想起来了......

开始了 0
+3

010100八进制为0×1 + 0 * 8 + 1 * 64 + 0 * 512 + 1 * 4096 = 64 + 4096 = 4160。 – 2010-04-18 21:20:45

+0

http://www.boost.org/doc/libs/1_42_0/libs/utility/utility.htm#BOOST_BINARY 这可能对您有用。虽然C++,但我认为它只是预处理器 – Anycorn 2010-04-18 21:27:59

+0

@aaa thx的建议,但我不认为我被允许使用第三方库。 – NomeN 2010-04-18 21:32:51

回答

1

如果您愿意写不可移植的代码和使用gcc,可以使用binary constants extension

#define _ImmSign 0b010100 
+1

argh ...我已经搜索了这个多次,但它从来没有出现在谷歌。太有趣了! – NomeN 2010-04-18 22:31:08

13

整数文字被解释为八进制,不是小数,以同样的方式开始0x该整数字面解释作为十六进制。

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

还要注意,以下划线开头的标识符后面跟着大写字母或其他下划线是为实现保留的,所以您不应在代码中定义它们。

+0

快速回答!是否有另一种方法来阻止它,然后去除前导零? – NomeN 2010-04-18 21:21:37

+2

@NomeN:No;这是该语言的基本部分。 – 2010-04-18 21:23:18

4

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

+0

另一个快速回复,thx!有没有解决这个问题的另一种方法,而不是删除前导0? – NomeN 2010-04-18 21:22:42

+0

不是我所知道的。 – Maulrus 2010-04-18 22:17:37

2

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

2

010100被C视为八进制数,因为前导字母为0.八进制10100为4160.

0

八:-)另一个线程

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