可能重复:
我能在C或C++中使用二进制字面值吗?
我正在学习C语言,最近发现我们可以用不同的方式表示整数,例如:
(假设i的“可读”值为512)以下是这些表示方法:
十进制:
int i = 512;
八进制:
int i = 01000;
十六进制:
int i = 0x200;
在二进制表示法中,512是 1000000000。如何在C语言中编写这个数?
类似于 int i = 1000000000b
吗? 这很有趣,但不幸的是没有C编译器接受该值。
可能重复:
我能在C或C++中使用二进制字面值吗?
我正在学习C语言,最近发现我们可以用不同的方式表示整数,例如:
(假设i的“可读”值为512)以下是这些表示方法:
int i = 512;
int i = 01000;
int i = 0x200;
类似于 int i = 1000000000b
吗? 这很有趣,但不幸的是没有C编译器接受该值。
标准中没有描述如何创建"二进制字面量"。但是,最新版本的GCC和Clang使用类似于十六进制语法的语法支持此功能,不同之处在于它是b
而不是x
:
int foo = 0b00100101;
就像所述的那样,使用这种二进制字面量会使您无法在Visual Studio的C和C ++编译器中使用,因此您可能希望注意在何处以及如何使用它们。
C++14(我知道,我知道,这不是C)标准化了对二进制字面量的支持。
在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
int i = 1 << 9; /* binary 1 followed by 9 binary 0's */
1<<9
和 1U<<9
是不同的。 - Danijel在标准的C语言中,你无法使用二进制来指定整数字面量。