C23 添加了对二进制文字 (
0xb10100110
) 的支持,并使用分隔符 ('
) 将它们分组以便于人类可读。这对于输入来说非常有用,但是如何将 printf 分组更改为四位组(十六进制“数字”)而不是三位(八进制数字)?
#include <stdio.h>
#include <locale.h>
int main() {
setlocale(LC_ALL, "en_US");
unsigned long long int i =
0b0001'0001'0010'0010'0001'0000'1111'0100'1011'0001'0110'1100'0001'1100'1011'0001;
printf("binary: %'#0*llb\n", (int)sizeof(i)*8, i);
return 0;
}
我希望输出如下所示:
0b0001'0001'0010'0010'0001'0000'1111'0100'1011'0001'0110'1100'0001'1100'1011'0001
不是这样的:
0b1,000,100,100,010,000,100,001,111,010,010,110,001,011,011,000,001,110,010,110,001
区域设置指定如何打印数字。 但这通常用于货币信息。 使用刻度 (
'
) 来分隔数字组是该语言的一些功能,以使程序列表更具可读性......因此,仅适用于源代码(实际上,您不能将它与浮点数一起使用,仅适用于整数文字(有符号或无符号)
printf()
是一个库函数,所以它的实现可以与早期的标准保持一致,并且源代码的格式与它如何实现数字打印无关。
正如您在一些评论中所说的那样,组分隔符(您在您的语言环境中使用
,
)及其位置(每三位十进制数字)不适用于您想要重现的功能,更重要的是,源代码中的勾号是为了您的方便而存在的,您可以按照自己喜欢的方式自由地对数字进行分组(例如,D. Knuth 在“计算机编程的艺术”中的常量列表中使用三个数字组在小数点之前,但在之后,例如 1,000 * PI = 3,141.59265 35897 93238 46264 33832 79502 8841
)。