提升::lexical_cast错误的输出
boost::lexical_cast wrong output
以bool
变量作为输入的boost::lexical_cast
的输出应为0
或1
值。但我得到了不同的价值。
这不是正常发生的事情。让我们看一下我编写的示例代码:
#include <string>
#include <boost/lexical_cast.hpp>
int main()
{
bool alfa = true; // Doesn't metter whether alfa is initialized at definition or not
char beta = 71; // An integer value. Different values don't make any differences.
memcpy(&alfa, &beta, sizeof(alfa));
printf("%sn", boost::lexical_cast<std::string>(alfa).c_str());
}
从这个代码中,我得到了"w"
(w 的 ASCII 代码是 71)作为输出!但我希望这是一个0
或1
值。
问题只是bool
变量将转换为的值。给定示例中的bool
变量已被视为 true。 导致问题的是想象我想转换回转换后的值。这就是它引发异常的地方,因为例如"w"字符无法转换为bool
。但是如果输出是0
或1
,重新转换是可能的。
std::string converted_value = boost::lexical_cast<std::string>(alfa);
bool reconverted_value = boost::lexical_cast<bool>(converted_value ); // In this line, boost::bad_lexical_cast will be thrown
我想知道输出是否正确,或者这是boost::lexical_cast
中的错误?
同样,当我尝试做同样的事情并将变量转换为int
时,我遇到了boost::bad_lexical_cast
例外。
我的加速版本:1.58
现场样品
C++ 标准没有指定布尔值在内存中的存储方式,只是有两个可能的值:true
和false
。现在,在您的机器上,我认为这些分别存储为1
和0
.编译器可以做出假设,特别是允许假设这些将是存储在布尔值中的唯一两个值。
因此,当boost::lexical_cast
看到布尔值时,它运行的代码可能如下所示(优化后)
// Gross oversimplification
std::string lexical_cast(bool value) {
char res = '0' + (int)value;
return std::string(1, res);
}
如果value
是0
或1
,这工作正常,可以满足您的需求。但是,您在其中放了一个71
。所以我们加上'0'
(48
)的ASCII码到71
得到119
,即'w'
的ASCII码。
现在,我不是一个C++标准专家,但我猜想将非标准值存储到具有memcpy
的布尔值中是未定义的行为。至少,您的代码是不可移植的。也许更精通标准的人可以填补我的知识漏洞。
你违反了规则。你期望什么,C++会向你的程序添加无用的代码来捕获规则破坏者?
布尔变量只能为 0 或 1,假或真。如果您正确分配它们,它们是根据规则进行的。
如果你对它们进行记忆或reinterpret_cast那么底层实现就会显现出来。bool
是一个内存字节。如果它以某种方式设置为 0 或 1 以外的内容,那么它就是这样。
我必须仔细检查,但我什至不确定您是否保证布尔值是一个字节。我想你可以用指针指向它。但是,如果硬件有某种方法可以创建指向一位的指针,您可能会对C++对此所做的工作感到非常惊讶。
- 输出错误,问题是找到总和5000位数字cpp
- 使用复制构造函数的程序输出错误
- 异或字符串加密/解密输出错误
- 在linux上使用g++输出错误,在windows上更正
- 使用递归函数 (c++) 将长字符串转换为整数时输出错误
- ECDSA 密钥对生成输出错误
- fscanf() 输出错误的值
- 输入 1024 后十进制到二进制转换的输出错误?
- 输出错误命令的条件语句
- cuSparse (cusparseDcsrgemm) 中的矩阵乘法输出错误的结果
- 为什么 du -sh 输出错误大小的内存映射文件
- VS2017 的输出错误,但 mingw 有效
- 如何使FFMPEG C 代码不输出错误消息
- 乘以时输出错误.这是我编译器中的错误吗?C
- 输出错误:两个不同编译器上的不同输出:Prime Cryptarithm USACO
- 为什么输出错误崩溃
- C++输入/输出错误
- 尝试用 c++ 制作一个简单的加法器.编译成功,但输出错误
- 当我使用此合并排序代码运行时,输出错误
- 递归功能输出错误的值