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?
我正在创建一个简单的可变打印程序,并且有意外的输出。 该程序给出输出 -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
- 取数字并将其转换为二进制。( 二进制
6
===0000 0000 0000 0110
- 将
1
交换到0
,0
交换到1
(1111 1111 1111 1001
( - 要获得结果 - 将
1
添加到上一个转换:(1111 1111 1111 1010
(
如您所见,(无符号(65530
(有符号(-6
的二进制表示完全相同。
这一切都在对位的解释中。 这就是为什么您必须小心接近类型中表示的最大值的原因。
在这种情况下,要存储此值,您可以:
- 将类型更改为
unsigned short int
- 更改为更大的类型。
您将 i 声明为 short int,这是一个 16 位有符号类型。这意味着它可以表示的最大数字实际上是 32767 (2^15-1(,最小的数字是 -32768 (-2^15(。65530 溢出该限制。因此,如果您打印了 32768,它将溢出到 -32768,32769 将溢出到 -32767,依此类推。查看有关有符号数字的二进制表示的更多主题,以更好地了解此过程
相关文章:
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 我不断收到 [错误] ID 返回 1 退出状态错误,但看不到问题所在
- OSX MetalKit CVMetalTextureCacheCreateTextureFromImage失败,状态:
- std::future_error:无关联状态
- 如何避免LED在循环状态变化中闪烁?
- boost 是否有按特殊类型值编码状态"compact optional"?
- 为什么系统函数总是在C++中返回已转移的退出状态?
- C++ 中的编译错误:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- 当可输入框在窗口中处于活动状态时获得通知的任何方法
- 检查两个节点在子节点上是否具有相同状态的更优雅的方法
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 编译问题:在函数"_start"中:未定义对"主"的引用 collect2:错误:ld 返回 1 个退出状态
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 试图在崇高中奔跑. 错误 已发生: 收集2.exe: 错误: ld 返回 1 退出状态
- 在容器上移动分配:以前包含的对象的状态
- collect2:错误:ld 返回 1 个退出状态未定义的引用
- 具有动态大小的特征矩阵的默认初始状态
- 如何从Clojure调用C++程序,以使程序保持打开状态?
- C ++中的错误输出,i = 65530,当我们打印i的值时,它给出-6状态65530