为什么ifstream读取0x80000000 int失败?
why does ifstream read fail for int with 0x80000000
在一个简单的控制台应用程序中,我试图读取每行包含十六进制值的文件。
它在前几个工作,但在4或5之后它开始输出cdcdcdcd。
知道这是为什么吗?以这种基本方式使用read有限制吗?
文件的第一个字节是它的大小。
std::ifstream read("file.bin");
int* data;
try
{
data = new int [11398];
}
catch (int e)
{
std::cout << "Error - dynamic array not created. Code: [" << e << "]n";
}
int size = 0;
read>>std::hex>>size;
std::cout<<std::hex<<size<<std::endl;
for( int i = 0; i < size; i++)
{
read>>std::hex>>data[i];
std::cout<<std::hex<<data[i]<<std::endl;
}
我得到的返回值是:
576 (size)
1000323
2000000
1000005
cdcdcdcd
cdcdcdcd
cdcdcdcd
...
在cdcdcdcd的位置上输出的第一个值是80000000
int类型溢出
如果您更改为unsigned int。您将能够填充到0xFFFFFFFF
您可以查看:
std::cout << "Range of integer: "
<< std::numeric_limits<int>::max()
<< " <Value> "
<< std::numeric_limits<int>::min()
<< "n";
std::cout << "Range of integer: "
<< std::numeric_limits<unsigned int>::max()
<< " <Value> "
<< std::numeric_limits<unsigned int>::min()
<< "n";
注意:没有负的十六进制值(它被设计为位表示的紧凑表示)。
你应该检查一下读取是否有效:
if (read>>std::hex>>data[i])
{
// read worked
}
else
{
// read failed.
}
听起来很像是你的阅读失败了。
注意,在32位的int
系统上,0x80000000
超出了int
的范围。有效值的范围可能是-0x80000000到0x7FFFFFFF。
std::hex
读取时,表示以16为基数写为80000000的正整数。一个特定的负整数可以在有符号的int
中以2的补码形式存储,其二进制表示形式与unsigned int
类型的正整数80000000存储在其中时的二进制表示形式相同。
如果您打算使用这种技术,请考虑读入unsigned int
。此外,检查读取操作的成功或失败也是必不可少的。如果流提取失败,则流将进入错误状态,在此状态下,所有后续读取都将失败,直到您在流上调用.clear()
。
NB。std::hex
(以及实际上所有其他修饰符)是"粘性的":一旦您设置了它,它将保持设置,直到您实际指定std::dec
来恢复默认值。
相关文章:
- G++ 内联在调用always_inline "int _rdrand16_step()"时失败
- ostream_iterator运算符=在pair<int,int>上失败,但在包装器类上工作。我不能为成对<>重载运算符<<吗?
- 从长型转换为相同大小的 int 失败
- 为什么make_pair<int,int>在C++ 11 中失败?
- std::vector<std::vector<int>>:调试断言失败。C++矢量下标超出范围保留内存
- 失败,dummy_array<int, 6> arr();
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- 当偏移太大(大于签名的INT 2^32范围)时,GZSEEK(ZLIB)失败
- C typedef int arr [x] [y]在stackdump错误中失败
- C++11 枚举类:加上 int 编译失败,为什么
- 超能力 NDK 安卓:返回 int 在"extern"块中成功,在调用函数中失败
- C/C++:将 char[] 转换为 int 失败,无符号 char[] 到 int 有效,为什么
- 如何编译这C++"'::main' must return 'int'"失败的代码?
- MKDIR 在 C++ 系统调用中失败 - int 类型的参数与 const char* 类型的参数不兼容
- 为什么这个int到binary的尝试在超过16时失败,以及我如何清理它
- 为什么“vector<int>(v1);”语句失败
- static_cast和interpret_cast的转换运算符int()失败
- 为什么 int vs 布尔类型检查失败
- CIN 将字符串的开头分配给 int,仅在第二次调用中失败
- 断言失败 <0 <= i && i < <int>vv.size<>> 在未知函数中,文件 src\matrix.cpp,第 912 行