在 C printf 中将 4 位集合分组为半字节

问题描述 投票:0回答:1

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
c binary printf literals c23
1个回答
0
投票

区域设置指定如何打印数字。 但这通常用于货币信息。 使用刻度 (

'
) 来分隔数字组是该语言的一些功能,以使程序列表更具可读性......因此,仅适用于源代码(实际上,您不能将它与浮点数一起使用,仅适用于整数文字(有符号或无符号)

printf()
是一个库函数,所以它的实现可以与早期的标准保持一致,并且源代码的格式与它如何实现数字打印无关。

正如您在一些评论中所说的那样,组分隔符(您在您的语言环境中使用

,
)及其位置(每三位十进制数字)不适用于您想要重现的功能,更重要的是,源代码中的勾号是为了您的方便而存在的,您可以按照自己喜欢的方式自由地对数字进行分组(例如,D. Knuth 在“计算机编程的艺术”中的常量列表中使用三个数字组在小数点之前,但在之后,例如 1,000 * PI = 3,141.59265 35897 93238 46264 33832 79502 8841
)

© www.soinside.com 2019 - 2024. All rights reserved.