将浮点转换为字节数组的程序中出现运行时错误
Runtime error in a program supposed to convert a float to a byte array
我得到了一个浮点变量,想知道它的字节表示是什么。所以我去了IDEOne并编写了一个简单的程序来实现这一点。然而,令我惊讶的是,它导致了一个运行时错误:
#include <stdio.h>
#include <assert.h>
int main()
{
// These are their sizes here. So just to prove it.
assert(sizeof(char) == 1);
assert(sizeof(short) == 2);
assert(sizeof(float) == 4);
// Little endian
union {
short s;
char c[2];
} endian;
endian.s = 0x00FF; // would be stored as FF 00 on little
assert((char)endian.c[0] == (char)0xFF);
assert((char)endian.c[1] == (char)0x00);
union {
float f;
char c[4];
} var;
var.f = 0.0003401360590942204;
printf("%x %x %x %x", var.c[3], var.c[2], var.c[1], var.c[0]); // little endian
}
在IDEOne上,它输出:
39 ffffff b2 54 4a
以及运行时错误。为什么会出现运行时错误,为什么b2
实际上是ffffffb2
?我猜想b2
是符号扩展。
char
是一个有符号的类型。如果它是8位长,并且你在其中放入任何大于127的值,它就会溢出。有符号整数溢出是未定义的行为,使用需要无符号的转换说明符打印有符号值也是如此(%x
需要unsigned int
,但char
在传递给可变printf()
函数时被提升[隐式转换]为signed int
)。
底线-将char c[4]
更改为unsigned char c[4]
,它将正常工作。
在struct
中用unsigned char
替换char
,并在末尾添加一个return 0;
解决了所有问题:http://ideone.com/ienG2b.
您的方法有很多错误。以下是如何打印通用对象的二进制表示:
template <typename T>
void hexdump(T const & x)
{
unsigned char const * p = reinterpret_cast<unsigned char const *>(&x);
for (std::size_t i = 0; i != sizeof(T); ++i)
{
std::printf("%02X", p[i]);
}
}
结果是,您可以始终将任何对象解释为字符数组,从而显示其表示形式。
相关文章:
- 为什么程序在 c++ 中迭代 emtpy 向量时会抛出运行时错误
- 调用 java 的回调() 时应用程序崩溃.由于 detatchThread 而获得运行时错误
- QT C++防止关闭应用程序时出现运行时错误
- 运行 libpng 应用程序时出现运行时错误
- 向 Kattis 在线评委提交 c++ 程序时出现未知运行时错误
- Qt 应用程序中与Qt版本相关的运行时错误
- 在计算机级别,应用程序以二进制方式运行,然后当发生运行时错误时,它如何呈现回错误代码
- 排列程序无法写入数组 - 运行时错误
- 为什么我的程序在删除以下代码中的注释后会出现运行时错误?
- c++分段错误:为什么这个程序给出运行时错误(SIGSEGV)
- 使用MinGW gcc/g++(nuwen发行版)编译的程序出现运行时错误
- QT程序无法编译/具有运行时错误(IDE:CodeBlocks/QTCreator)
- 数组总和在程序运行时给出错误的答案
- 程序C++运行时错误
- 基于graphics.h的程序出现代码块运行时错误
- OCCI C++应用程序的Visual Studio调试运行时错误
- 字符串程序C++运行时错误
- C++基本程序运行时错误
- 简单的DirectX 11程序运行时错误
- OpenCV程序运行时错误