在二进制中,C代表整数。

14

可能重复:
我能在C或C++中使用二进制字面值吗?

我正在学习C语言,最近发现我们可以用不同的方式表示整数,例如:

(假设i的“可读”值为512)以下是这些表示方法:

十进制:

int i = 512; 

八进制:

int i = 01000;

十六进制:

int i = 0x200;

在二进制表示法中,5121000000000。如何在C语言中编写这个数?

类似于 int i = 1000000000b 吗? 这很有趣,但不幸的是没有C编译器接受该值。


4
十六进制实际上只是二进制的更有用的表示方式。 - James
请参见 https://dev59.com/yHE85IYBdhLWcg3wyGp_。 - Henry Gomersall
4个回答

37

标准中没有描述如何创建"二进制字面量"。但是,最新版本的GCC和Clang使用类似于十六进制语法的语法支持此功能,不同之处在于它是b而不是x

int foo = 0b00100101;

就像所述的那样,使用这种二进制字面量会使您无法在Visual Studio的C和C ++编译器中使用,因此您可能希望注意在何处以及如何使用它们。

C++14(我知道,我知道,这不是C)标准化了对二进制字面量的支持。


13

在C语言中你无法做到这一点。

但是你说你正在学习C++。在C++中,你可以使用BOOST_BINARY直到C++0x出现后,就能够使用用户自定义字面值

请注意,转换十六进制到二进制以及反向转换非常容易。

对于给定的二进制数,只需将数字分组为四个一组,然后记住:

0000 <-> 0  
0001 <-> 1  
0010 <-> 2   
0011 <-> 3
0100 <-> 4
0101 <-> 5
0110 <-> 6
0111 <-> 7
1000 <-> 8
1001 <-> 9
1010 <-> A
1011 <-> B
1100 <-> C
1101 <-> D
1110 <-> E
1111 <-> F

经过几次在脑海中进行这种转换尝试后,你会变得非常熟悉它。 (当然,你也可以使用八进制进行同样的转换,但是十六进制比八进制更加紧凑。)

对于您的特定示例:

1000000000 -> 10 0000 0000 -> 0010 0000 0000 -> 0x200

1
谢谢,我应该把它打印出来贴在我的桌子上。 - user562854
是的...经过几次转换,你会发现你不再需要纸了。记忆十六进制数及其转换为二进制/十进制就像吃蛋糕一样容易。 - pmg

8
在C语言中(我相信C++也是如此),不存在数字的二进制表示。但是,对于您展示的简单数字,您可以使用一种快捷方式。
int i = 1 << 9; /* binary 1 followed by 9 binary 0's */

其他数字呢(不是浮点数,只是整数)?有没有工具或图表可以帮助我学习这些“快捷方式”? - user562854
你可以轻松地编写一个二的幂次方表,并在需要时使用它。我认为,跟踪这个表(如果是手写的)比记住其中一些幂数更麻烦:2^0 == 1; 然后是2、4、8、16、32... 2^10 是1024;65536 是2^16,...,...(实际上你不需要记忆2^16之后的数字,通常也不需要超过2^8)。 - pmg
或者学习十六进制(甚至八进制)数字的位模式,自己进行转换。 - David Thornley
在进行移位操作时,要注意操作数的类型:1<<91U<<9 是不同的。 - Danijel

3

在标准的C语言中,你无法使用二进制来指定整数字面量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接