我应该在 stoi() 函数中放入多少位

how many bits I should put in stoi() function

本文关键字:多少 函数 stoi 我应该      更新时间:2023-10-16

以下代码将使程序崩溃:

            string test="b1";
            unsigned __int8 t1 = stoi(test, 0, 8);

但是'b1'=177,对于8位来说应该没问题,对吧?,如果我使用

string test="b1";
unsigned __int8 t1 = stoi(test, 0, 16);

一切看起来都很好,为什么需要为"B1"使用 16 位?

更复杂的情况是 16 位会让它正确,但 32 位会让它出错!!

string test="0800";

unsigned __int16 t1 = stoi(test, 0, 16);

std::stoi的第三个参数与任何位数无关。 它是表示数字的基数。

2表示二进制,8表示八进制,10表示十进制,16表示十六进制,等等,一直到36为基数。 0 表示从前缀确定基数:以 "0x""0X" 开头的字符串被解释为十六进制,以 "0" 开头的字符串被解释为八进制,所有其他字符串被解释为十进制。

当您调用 std::stoi("b1", 0, 8) 时,std::stoi将抛出std::invalid_argument异常,因为 b 不是 base-8 中的有效数字,并且如果未捕获该异常,您的程序将崩溃。

std::stoi("0800", 0, 16)std::stio("0800", 0, 32) 都是完全有效的,但当然 80016 和 80032 表示不同的数字,因此两个调用将返回不同的结果。

数 8 正好有 8 个不同的数字。有效数字如下:

0
1
2
3
4
5
6
7

请注意,b 不是以 8 为基数的有效数字。只有大于或等于 12 的基数才具有数字b

如果我使用

unsigned __int8 t1 = stoi(test, 0, 16);

一切看起来都还行

16 大于或等于 12。 b 是以 16 为基数的有效数字。