C++ C++;传递表示负值的十六进制时,stoll抛出超出范围异常
我正在使用Visual Studio 2013,我正在尝试使用stoll将以十六进制格式编写的表示负值的字符串转换为long-long,但我得到了超出范围的异常。你知道为什么吗 e、 g.0xFFFFFFFFFA7E,即-1410十进制 示例代码:C++ C++;传递表示负值的十六进制时,stoll抛出超出范围异常,c++,visual-studio-2013,hex,C++,Visual Studio 2013,Hex,我正在使用Visual Studio 2013,我正在尝试使用stoll将以十六进制格式编写的表示负值的字符串转换为long-long,但我得到了超出范围的异常。你知道为什么吗 e、 g.0xFFFFFFFFFA7E,即-1410十进制 示例代码: std::string s = "0xFFFFFFFFFFFFFA7E"; size_t pos; auto result = std::stoll(s, &pos, 16); 仅仅因为无符号算术(您甚至没有在这里使用)环绕并不意味着0xF
std::string s = "0xFFFFFFFFFFFFFA7E";
size_t pos;
auto result = std::stoll(s, &pos, 16);
仅仅因为无符号算术(您甚至没有在这里使用)环绕并不意味着0xFFFFFFFFFA7E是-1410十进制。不是 这是一个(非常大的)正数:根据我的计算,是18446744073709550000 无法由在有符号64位类型中工作的函数处理,因为有符号64位类型的最大值为9223372036854775807
由于
大小\u t
是一种无符号64位类型,您需要读取一个只适合无符号64位类型的值,因此请使用执行该操作的函数:。因为无符号算术(您甚至没有在这里使用)环绕并不意味着0xFFFFFFFFFA7E是-1410十进制。不是
这是一个(非常大的)正数:根据我的计算,是18446744073709550000
无法由在有符号64位类型中工作的函数处理,因为有符号64位类型的最大值为9223372036854775807
由于
大小\u t
是一种无符号64位类型,您需要读取一个只适合无符号64位类型的值,因此请使用执行该操作的函数:。自由是奴隶。所有权就是盗窃。自由就是奴隶。所有权就是盗窃。15是-1。谢谢你的回答,但老实说,我并不是什么都懂。对于64位长的数字,0xFFFFFFFFFA7E是-1410的两位补码。为什么这个stoll函数将其视为未签名的?如果我希望它是这样的,我会使用stoull函数。@KrzysztofKupka:“为什么这个stoll函数把它当作无符号的?”它没有。它将其视为已签名。这是一个有符号的正数。而且,签名时,它超出了范围,就像例外情况所说的那样。您需要将其视为无符号变量,以便它在范围内,您可以这样做,因为您将要将其放入无符号变量中。@KrzysztofKupka:“0xfffffffa7e在64位长的数字的两个补码中为-1410”这是一个错误陈述-0x582为-1410。0xFFFFFFFFFA7E是18446744073709550000。你把价值和表现混为一谈<代码>strtoll不读取位模式;它读数字。2的补码与此无关。谢谢你的回答,但老实说,我并不是什么都懂。对于64位长的数字,0xFFFFFFFFFA7E是-1410的两位补码。为什么这个stoll函数将其视为未签名的?如果我希望它是这样的,我会使用stoull函数。@KrzysztofKupka:“为什么这个stoll函数把它当作无符号的?”它没有。它将其视为已签名。这是一个有符号的正数。而且,签名时,它超出了范围,就像例外情况所说的那样。您需要将其视为无符号变量,以便它在范围内,您可以这样做,因为您将要将其放入无符号变量中。@KrzysztofKupka:“0xfffffffa7e在64位长的数字的两个补码中为-1410”这是一个错误陈述-0x582为-1410。0xFFFFFFFFFA7E是18446744073709550000。你把价值和表现混为一谈<代码>strtoll不读取位模式;它读数字。二的补语和它没有任何关系。