错误含义;以二进制形式打印数字

Error meaning; printing a number in binary form

本文关键字:式打印 数字 二进制 错误      更新时间:2023-10-16

我在这里使用了代码,但编译器给了我错误:

从"short int"转换为"long unsigned int"可能会改变结果的符号[-Werror=sign-conversion]

为什么?

#include <cstdlib>
#include <iostream>
#include <bitset>
using namespace std;
int main()
{
char a = -58;
std::bitset<8> x(a);
std::cout << x << 'n';
short c = -315;
std::bitset<16> y(c);
std::cout << y << 'n';
system("pause");
return 0;
}

有两个问题:首先,编译器警告代码中的隐式类型转换。其次,编译器将警告视为错误,导致生成失败。

位集采用无符号长整型类型的参数,但您正在尝试传递(有符号的(短整型。您知道它会将有符号值提升为 2 的补码值,并执行您的期望,但编译器不确定您是否理解这一点,并且会发出警告。解决此问题的最基本方法是类型转换,它显式地告诉编译器进行转换。有多种方法可以做到这一点。最简单和最具可读性的是较旧的 C 样式转换,它也适用于C++:

std::bitset<16> y((unsigned long)c);

C++风格的替代方案:

std::bitset<16> y(static_cast<unsigned long>(c));

有关警告即错误的更多信息:

Werror 是一个编译器标志,它将警告视为错误。虽然将警告视为错误可以强制实施严格性,现在允许您继续操作而不以某种方式显式解决警告,但在维护不是您编写的大型代码库时,这也可能会很麻烦。若要禁用您看到的特定错误警告,请将其更改为 Wno-error:

-Wno-error=sign-conversion

请注意,这不会禁用警告,它只会禁用将其提升为强制编译失败的错误的选项。始终查看警告。

您还可以使用-Wno-error禁用所有警告作为错误。将警告禁用为错误是很常见的,因为处理通常由其他人编写的大型代码以及不太严格的编译器和语言版本可能很困难,因为在完成构建之前需要满足每个警告。有时,您希望构建和运行现有代码,而无需重写它以满足所有警告。