C ++中的错误输出,i = 65530,当我们打印i的值时,它给出-6状态65530

Wrong output in c++ , i=65530 and when we print value of i it gives -6 instate of 65530. why?

本文关键字:65530 状态 打印 我们 输出 错误      更新时间:2023-10-16

我正在创建一个简单的可变打印程序,并且有意外的输出。 该程序给出输出 -6,但我本来期望 65530。

为什么?

#include<iostream>
int main(){
short int i=65530;
std::cout<<i;
}

这与您使用的类型的二进制表示有关。

作为 16 位二进制文件:65530===1111 1111 1111 1010

但是你已经使用了short int它是一个有符号的数字,在它的二进制定义中,它由 1 位表示为符号,15 位表示为数字:

(1)111 1111 1111 1010

  • 那么为什么表示中有这么多 1?
  • 为什么这 15 位看起来不像二进制 ((1)000 0000 0000 0110( 中的6

这是因为负数以二进制表示的方式。

为了以二进制表示有符号数字,使用了一种称为 Two 补码的格式。

所以这里有一个数字变换的例子-6

  1. 取数字并将其转换为二进制。( 二进制6===0000 0000 0000 0110
  2. 1交换到00交换到1(1111 1111 1111 1001(
  3. 要获得结果 - 将1添加到上一个转换:(1111 1111 1111 1010(

如您所见,(无符号(65530(有符号(-6的二进制表示完全相同。

这一切都在对位的解释中。 这就是为什么您必须小心接近类型中表示的最大值的原因。

在这种情况下,要存储此值,您可以:

  1. 将类型更改为unsigned short int
  2. 更改为更大的类型。

您将 i 声明为 short int,这是一个 16 位有符号类型。这意味着它可以表示的最大数字实际上是 32767 (2^15-1(,最小的数字是 -32768 (-2^15(。65530 溢出该限制。因此,如果您打印了 32768,它将溢出到 -32768,32769 将溢出到 -32767,依此类推。查看有关有符号数字的二进制表示的更多主题,以更好地了解此过程

相关文章: