如何在c语言中实现二进制到十进制的转换

如何在c语言中实现二进制到十进制的转换,c,programming-languages,implementation,C,Programming Languages,Implementation,printf的实现如何有效地实现整数值到十进制的转换?您只需要知道计算机只能执行两种操作:第一种是补码运算,第二种是加法运算。所有其他操作也由这两个操作执行。当在内存中存储数据时,如果2的补码是为了转换而实现的,这也是从上述两个操作推导出来的,并且再次执行从二进制到十进制的转换。在现代计算机上,计算通常比I/O快得多,这里就是这种情况。C库将使用一种简单的方法。模选项用于获取最低有效数字,除法用于消耗数字并进行迭代。不幸的是,这些数字的生成顺序与I/O顺序相反,因此在输出之前需要对它们进行缓冲。

printf
的实现如何有效地实现整数值到十进制的转换?

您只需要知道计算机只能执行两种操作:第一种是补码运算,第二种是加法运算。所有其他操作也由这两个操作执行。当在内存中存储数据时,如果2的补码是为了转换而实现的,这也是从上述两个操作推导出来的,并且再次执行从二进制到十进制的转换。

在现代计算机上,计算通常比I/O快得多,这里就是这种情况。C库将使用一种简单的方法。模选项用于获取最低有效数字,除法用于消耗数字并进行迭代。不幸的是,这些数字的生成顺序与I/O顺序相反,因此在输出之前需要对它们进行缓冲。这可以通过递归实现,但最大位数是先验的,因此预先分配字符数组的速度更快

数字可能是负数,因此在循环外处理

char digits[N];
p = &digits[N-1];
*p-- = 0;
unsigned x = integer_input;
if (integer_input < 0 && integer_input >= -INT_MAX) x = -integer_input;
do {
    *p-- = (x % 10) + '0';
    x /= 10;
} while x != 0;
if (integer_input < 0) *p-- = '-'
// now p points to c string
char位[N];
p=&位[N-1];
*p--=0;
无符号x=整数_输入;
如果(整数输入<0&&integer输入>=-INT\u MAX)x=-integer\u输入;
做{
*p--=(x%10)+“0”;
x/=10;
}而x!=0;
如果(整数_输入<0)*p--='-'
//现在p指向c字符串
这是,尽管它支持10以外的基数

这是


这两种方法都遵循上述方法,但都是通用的。

Read and。您的问题似乎超出了堆栈溢出的范围。2的补码不是C支持的唯一二进制表示形式。请阅读语言和标准库标准文档(进行搜索)。@jwdonahue:(a)此处不需要MRE。此问题不是请求调试帮助。(b) 语言和标准库文档没有提供如何实现转换的信息,这正是问题所要求的。实际上,标准使用了“未定义”和“实现定义”等形式的措辞。我总是检查新用户是否阅读过,如果没有,我建议他们阅读,以供他们自己启发。
任何支持您答案的官方c文档
都在标准库中实现,该库是为您的目标和编译器实现的。标准并不关心它是如何实现的。“如何在c语言中实现二进制到十进制的转换”有一个问题,即STL欺骗。标准库实现可以使用未定义的行为和实现定义的行为,这对该系统是有利的,因为它可以“知道”UB和IDB是如何工作的。。不应使用可移植用户代码。例如,一些标准库源代码do
inti。。。。。无符号u=。。。(未签名)-i(UB带
i==INT\u MIN
)。因此,对于用户代码来说,查看STL源代码并不总是一个好的实践。如果你没有足够的声誉来评论-不要用答案作为评论。你在这里写的没有多大意义这是一种方法。是什么让您认为这是标准C库中使用的方式?他们不应该使用一些更有效的方法吗?问题是“它是如何实现的?”而不是“标准要求什么?”这是我见过的一些STDLIB中使用的方法。我没有问标准要求什么。我问你是什么让你认为C实现就是这样做的。它是粗糙和低效的,所以我不期望它是任何质量C实现实际使用的。这个答案断言“C库将使用一种简单的方法。”我认为这对于良好的实现来说是错误的。添加了一个指向NewLibThank的链接,@chux.monica,我使用了你的
integer\u input>=-INT\u MAX
建议;非常有用。