【问题标题】:Why is the code giving output of -61 when I do cout c but 195 when I cout a+b?为什么当我执行 cout c 时代码输出为 -61 而当我 cout a+b 时输出为 195?
【发布时间】:2021-07-10 06:31:13
【问题描述】:

我写了下面的代码,不明白为什么我cout时得到-61

int main() {
char a= 'a';
char b= 'b';
char c= a+b;
cout<<int(a)<<" ";
cout<<int(b)<<" ";
cout<<int(a+b)<<" ";
cout<<int(c)<<" ";
return 0;

}

**OUTPUT**
97 98 195 -61

【问题讨论】:

  • 范围为 -128..127 的有符号字符溢出。
  • @S.M.请创建一个答案并详细说明。
  • 在不同编码的平台上,你会得到不同的输出。例如,在 EBCDIC(编码受到 Hollerith 穿孔卡片的强烈影响)中,'a' 为 129,'b' 为 130,char 将具有无符号行为,除非编译器被标记为将 char 视为有符号。将它们相加得到 259,模 256 = 3。

标签: c++ char output


【解决方案1】:

char 类型可以是有符号或无符号的。它由编译器标志调整。 Char 类型在大多数编译器中默认是有符号的,由 8 位组成,1 位用于符号,7 位用于数值。因此,有符号字符表示从 -128 到 127 的数值。这样的一组值是一个环。进一步增加127返回-128。

如您所见,97 和 98 是 'a' 和 'b' 的 ASCII 码。在应用运算符之前,任何小于 int 的类型都会被提升为 int,因此 a+b 是 int 195。如果将 195 分配给有符号字符,则会发生有符号值溢出,这被认为是未定义的行为,因为可以表示有符号值与上面不同。在您的情况下,195 在 68 上超过 127,因为 127+1 是 -128,因此 127+68 127+1+67 是 -128+67 是 -61。

【讨论】:

    【解决方案2】:

    C++ 没有operator+(char,char)。因此,当您添加两个chars 时,参数将提升为ints,结果为int。

    使用超出编译器char 范围的int(值195)进一步初始化char c(似乎是-128 ... 127)是实现定义的行为按照 C++ 标准。

    在您的实现中,这种行为看起来很常见......对于值x &gt; 127 如此有效,结果是x - 256。 195 - 256 的值是 -61。

    如果您想要 8 位整数,可以在范围内包含 195,您应该使用 unsigned char 或 uint8_t。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-04
      • 2015-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-07
      相关资源
      最近更新 更多