我正在清理我们的一些网络代码,同时用更多explcit typedef替换各种整数类型(int
,unsigned short
,...),例如int32_t
和{{ 1}}我想知道不同编译器之间的可移植性uint16_t
和double
。我们发送的结构类似于以下内容:
float
到目前为止,只使用VC ++编译的程序,但是计划在GCC上使用协议。
现在的问题是:即使然后由不同的编译器解释,struct foo
{
uint32_t id;
double dbl;
};
...
// copy_packed() copies packed bytes of integral type and adheres
// to network byte-ordering
copy_packed(int32_t data, char* buffer, char* end);
copy_packed(uint32_t data, char* buffer, char* end);
copy_packed(uint16_t data, char* buffer, char* end);
...
// overload for structure types calls overloads for its members
void copy_packed(foo &data, char* buffer, char* end)
{
copy_packed(data.id, buffer);
copy_packed(data.id, buffer);
};
amd double
是否可以安全地通过网络发送?问题 - 据我所知 - 归结为GCC和VC ++是否符合IEEE754。或者可能提供转换为符合包装的功能?
有关此事的任何提示?
答案 0 :(得分:4)
您可以询问编译器:std::numeric_limits<T>::is_iec559
将告诉您类型T
是否为IEC559(IEEE754)类型。
答案 1 :(得分:4)
不是很好。 IEEE没有定义字节顺序,并非所有系统都是IEEE。
真正的问题是你必须具有多么便携。 IEEE几乎就是这样
适用于现代Unix平台以及Windows;如果你的
可移植性仅限于这些,您通常可以输入float
进入uint32_t
,双进uint64_t
,并处理输入和
那样输出。如果你必须考虑大型机(和
可能是嵌入式处理器 - 我不太熟悉它们,
你还有很多工作要做;主要浮点数
大型机甚至不是基础2.
答案 2 :(得分:2)
这是我在浮点算术上看过的最好的文章之一。 Jump in to Current IEEE 754 Implementations
IEEE 754算法的当前实现可以分为两个 群体以他们支持不同的程度来区分 硬件中的浮点格式。基于扩展的系统, 以英特尔x86系列处理器为例,提供全面的 支持扩展的双精度格式,但只支持部分格式 支持单精度和双精度:它们提供指令 以单精度和双精度加载或存储数据,转换它 他们提供的是扩展的双重格式的动态 特殊模式(不是默认值)中的算术结果 即使它们,操作也会四舍五入为单精度或双精度 以扩展的双重格式保存在寄存器中。 (摩托罗拉68000 系列处理器圆形结果的精度和范围 这些模式中的单或双格式。 Intel x86兼容 处理器将结果舍入为单精度或双精度 格式但保留与扩展双格式相同的范围。) 单/双系统,包括大多数RISC处理器,提供完整 支持单精度和双精度格式,但不支持 符合IEEE标准的扩展双精度格式。 (IBM POWER 架构仅提供对单精度的部分支持,但是 为了本节的目的,我们将其分类为单/双 系统。)