用cin输入后再输出为什么会有这样的溢出错误呢?

来源:百度知道 编辑:UC知道 时间:2024/09/27 09:29:02
设置一个int变量如a,然后用cin手动赋一个16进制的32bit的值,如0xdf456954
然后再用cout输出时,就会输出为0x7fffffff
可是我在程序中直接初始化后就给a赋这个0xdf456954的值的话,再用cout输出a,就能正确的输出0xdf456954
这是为什么?难道是直接赋值时int的符号位可以被占用,而用cin输入时符号位是不被占用的这个原因吗?
谢谢啊,回答的很详细
但我猜的也不是错的,在vc6.0里直接用cin输入int型变量是应该考虑符号位的,cin是不会让你改变符号位的,所以大于0x7fffffff的数就不应该用cin输入给int了,就应该用unsigned类型

/*0xdf456954超出了int的最大值那么a是什么值就不确定了。要看编译器的处理方式,常见的是求模;
我理解你的意思
是说怎么在代码里赋值都可以输出,怎地从标准输入就不同。
那么我要告诉你的是这中属于未定义的行为。是没有标准的。
我们要做的就是不让存储的数值超过一个类型所能表示的范围,
这样我们才能确定我们所要的值,如果你想知道编译器是怎样
截断赋值那么你就要找这个编译器的参数等资料,问大神吧,呵呵
*/
#include <iostream>
using namespace std;

int main()
{

__int64 a(0); //或者long long a(0);
cout.setf(ios::hex, ios::basefield);
cout.setf(ios::showbase);
cin.setf(ios::hex, ios::basefield);
cin >> a;
cout << a << endl;

return 0;
}

问题我明白了
计算机不认识0x的,它只是我们人为规定的符号~~~
0xdf456954其实只输入了0
x是字符,它在这里就停止读入了
所以会有0x7fffffff的输出了
有问题留言

unsigned long a;
cin>>hex>>a;我猜你少了这个
cout<<hex<<a;