C++中混淆数据类型的混淆

C++中混淆数据类型的混淆,c++,C++,我正在试图弄清楚这段代码发生了什么 int i = 10, j = 7, l; unsigned int k; double q = 3.56; char c; c = q * i * j; l = c; std::cout << l << "\n"; // result is -7 std::cout << c << "\n"; // result is ? 我不明白为什么l的结果是“7”,而对于c,无论我改变值I,j,c的结果总是“?”。有

我正在试图弄清楚这段代码发生了什么

int i = 10, j = 7, l;
unsigned int k;
double q = 3.56;
char c;

c = q * i * j;
l = c;
std::cout << l << "\n"; // result is -7
std::cout << c << "\n"; // result is ?

我不明白为什么l的结果是“7”,而对于c,无论我改变值I,j,c的结果总是“?”。有人能告诉我一个原因吗?谢谢

字符的默认显示方法是其ascii/unicode值。对于无法显示的值,a?如图所示。
对于其他人,将显示等效字符。例如,字符值65将显示一个

字符的默认显示方法是其ascii/unicode值。对于无法显示的值,a?如图所示。 对于其他人,将显示等效字符。例如,char值65将显示一个

,3.56*10*7的结果是249.2

如果系统上的char类型是一个带符号的8位值,范围为-128到127,则尝试分配249.2将导致溢出。如果指定一个int而不是char,它将存储为249

问号是因为-7不是可打印字符。

3.56*10*7的结果是249.2

如果系统上的char类型是一个带符号的8位值,范围为-128到127,则尝试分配249.2将导致溢出。如果指定一个int而不是char,它将存储为249


问号是因为-7不是可打印字符。

您正在将值249.2写入超出范围的带符号字符,因此它被转换为?字符。

您正在将值249.2写入一个超出范围的带符号字符,因此将其转换为?字符。

3.56*7*10是249.200…..2。当它被放入一个字符中时,它变为-7,因为一个字符是一个8位的有符号值-7来自249截断的-256。

3.56*7*10是249.200…..2。当它被放入一个字符中时,它变为-7,因为一个字符是一个8位的有符号值-7来自249截断的-256。

至于-7,请参阅马克的答案:至于-7,请参阅马克的答案:它是一种字符数据类型。这是一个char数据类型。这是一个很好的解释,除了值得添加为什么会导致溢出,尤其是-7。我不知道如何在不链接到2的补码的基础上简单地解释它,但是249-256=7似乎是一个开始。而且当然C++不能保证签名值这样工作,只是提问者的平台,像大多数一样,这样做。伟大的解释,除了它可能值得添加为什么导致溢出结果在- 7,特别是。我不知道如何在不链接到2的补码的基础上简单地解释它,但是249-256=7似乎是一个开始。当然C++不能保证签名值这样工作,就像大多数人那样,提问者的平台就是这样做的。