gpt4 book ai didi

c++ - std::cout 如何将数字类型转换为基数 10?

转载 作者:行者123 更新时间:2023-12-03 06:51:05 24 4
gpt4 key购买 nike

我已经了解了数字类型,例如 intlong long , 在 C++ 中以二进制格式存储。可以使用按位运算符访问和修改这些单独的位。
但是,我最近想知道为什么 std::cout 中的数字没有打印到屏幕上。也以 2 为基数,并认为它们在打印之前必须已转换为基数 10。换句话说,由于 std::cout以 10 为基数输出这些数字,我认为必须进行一些转换过程才能将这些数字从 base-2 转换为 base-10。
总的来说,我的问题是,是否std::cout实际上将数字从基数 2 转换为基数 10,它是如何做到的?我在这里犯了其他一些逻辑错误吗?

最佳答案

我发现 libstdc++(gcc 的标准库)源几乎无法导航,但我认为它的主要内容在这里完成:
https://github.com/gcc-mirror/gcc/blob/8e8f6434760cfe2a1c6c9644181189fdb4d987bb/libstdc%2B%2B-v3/include/bits/locale_facets.tcc#L794
这似乎对十进制数字使用了很好的“除以 10 并打印余数”技术:

do
{
*--__buf = __lit[(__v % 10) + __num_base::_S_odigits];
__v /= 10;
}
while (__v != 0);

稍微分解一下,请记住 char type 只是一个数字,当你写一个字符时,它会在表格中查找字符。在旧的 ASCII 和新的 UTF-8 字符编码中, '0'是 48, '1'是 49, '2'是 50 等等。这非常方便,因为您可以通过将其添加到“0”来打印任何数字 0-9:
putchar('0' + 3) // prints 3
所以,要得到每个数字,除以 10,余数是最后一个数字:
int x = 123;
putchar('0' + (x % 10)) // prints '0' + 3, or '3'
x = x / 10; // x = 12
putchar('0' + (x % 10)) // prints '0' + 2, or '2'
x = x / 10; // x = 1
putchar('0' + (x % 10)) // prints '0' + 1, or '1'
x = x / 10; // x = 0, stop
库中的代码片段只是在循环中执行此操作。
您会注意到代码向后打印数字。这就是为什么库中的代码段会减少每个迭代器的字符指针( *--__buf = ... ) - 它从右侧开始并从右到左反向打印。

关于c++ - std::cout 如何将数字类型转换为基数 10?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64880362/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com