错误含义;以二进制形式打印数字
Error meaning; printing a number in binary form
我在这里使用了代码,但编译器给了我错误:
从"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
禁用所有警告作为错误。将警告禁用为错误是很常见的,因为处理通常由其他人编写的大型代码以及不太严格的编译器和语言版本可能很困难,因为在完成构建之前需要满足每个警告。有时,您希望构建和运行现有代码,而无需重写它以满足所有警告。
相关文章:
- 打印数字图案
- 错误含义;以二进制形式打印数字
- 列中打印数字时如何避免打印垃圾?
- C++ 在地板函数之后以十六进制打印数字
- C/C++ - 用于按顺序打印数字的 sem_t 类型的单个信号量
- 仅打印数字的小数位
- 在 c++ 列中打印数字
- 为什么 al_draw_textf() 打印数字而不是存储在字符串变量中的字母
- 如何使用递归按从 1 到 n 的升序打印数字,其中 n 在该函数的参数中给出
- 该程序如何反向打印数字的数字?
- C 以升级循环时按升序打印数字
- 如何使用C 中的printf打印数字列表
- 悬挂式C 打印形状来自字符串阵列
- 为什么使用算术而不是bitest以二进制形式打印数字更快
- 如何在 c++ 中的字符串中显式打印“”
- 为什么不按升序打印数字
- 从文件中流式传输数字
- 为什么这段代码不能正常打印数字?
- 尝试优化和理解打印数字除数的递归函数的运行时
- 我希望程序打印数字 0 到 99,但是当我运行代码时,我看到 100 行 99