以下代码抄自《网络多人游戏架构与编程》,可以支持float、int、double等数据类型数据的大小端转换,测试代码为:

void TestByteSwap()
{int32_t test = 0x12345678;float floatTest = 1.f;printf( "swapped 0x%x is 0x%x\n", test, ByteSwap( test ) );printf( "swapped %f is %f\n", floatTest, ByteSwap( floatTest ) );printf( "swapped 0x%x is 0x%x\n", TypeAliaser< float, uint32_t >( floatTest ).Get(), TypeAliaser< float, uint32_t >( ByteSwap( floatTest ) ).Get() );
}

写成模板的形式更加规范一些

inline uint16_t ByteSwap2( uint16_t inData )
{return ( inData >> 8 ) | ( inData << 8 );
}inline uint32_t ByteSwap4( uint32_t inData )
{return  ( ( inData >> 24 ) & 0x000000ff ) |( ( inData >>  8 ) & 0x0000ff00 ) |( ( inData <<  8 ) & 0x00ff0000 ) |( ( inData << 24 ) & 0xff000000 );
}inline uint64_t ByteSwap8( uint64_t inData )
{return  ( ( inData >> 56 ) & 0x00000000000000ff ) |( ( inData >> 40 ) & 0x000000000000ff00 ) |( ( inData >> 24 ) & 0x0000000000ff0000 ) |( ( inData >>  8 ) & 0x00000000ff000000 ) |( ( inData <<  8 ) & 0x000000ff00000000 ) |( ( inData << 24 ) & 0x0000ff0000000000 ) |( ( inData << 40 ) & 0x00ff000000000000 ) |( ( inData << 56 ) & 0xff00000000000000 );
}template < typename tFrom, typename tTo >
class TypeAliaser
{
public:TypeAliaser( tFrom inFromValue ) :mAsFromType( inFromValue ) {}tTo& Get() { return mAsToType; }union{tFrom   mAsFromType;tTo     mAsToType;};
};template <typename T, size_t tSize > class ByteSwapper;//specialize for 1...
template <typename T>
class ByteSwapper< T, 1 >
{
public:T Swap( T inData ) const{return inData;}
};//specialize for 2...
template <typename T>
class ByteSwapper< T, 2 >
{
public:T Swap( T inData ) const{uint16_t result =ByteSwap2( TypeAliaser< T, uint16_t >( inData ).Get() );return TypeAliaser< uint16_t, T >( result ).Get();}
};//specialize for 4...
template <typename T>
class ByteSwapper< T, 4 >
{
public:T Swap( T inData ) const{uint32_t result =ByteSwap4( TypeAliaser< T, uint32_t >( inData ).Get() );return TypeAliaser< uint32_t, T >( result ).Get();}
};//specialize for 8...
template <typename T>
class ByteSwapper< T, 8 >
{
public:T Swap( T inData ) const{uint64_t result =ByteSwap8( TypeAliaser< T, uint64_t >( inData ).Get() );return TypeAliaser< uint64_t, T >( result ).Get();}
};template < typename T >
T ByteSwap( T inData )
{return ByteSwapper< T, sizeof( T ) >().Swap( inData );
}

C++ int float double类型的数据大小端转化相关推荐

  1. C 语言实例 - 计算 int, float, double 和 char 字节大小

    C 语言实例 - 计算 int, float, double 和 char 字节大小C 语言实例 C 语言实例使用 sizeof 操作符计算int, float, double 和 char四种变量字 ...

  2. [C]C语言基本语句(5/7)→ 用scanf语句输入int, float, double, char型数据

    当需要用键盘输入一个或几个数字或字符,就要用到scanf 例1: 基本格式 #include<stdio.h> int main() {int a,b;scanf("%d,%d& ...

  3. c语言算式中有double和int,C语言当中int,float,double,char这四个有什么区别?

    区别在以下方面: 一.定义方面: 1.int为整数型,用于定义整数类型的数据 . 2.float为单精度浮点型,能准确到小数点后六位 . 3.double为双精度浮点型,能准确到小数点都十二位 . 4 ...

  4. java中float和double型数据在赋值时有哪些注意事项?,java语言中float和double类型的数据在编程时的注意事项...

    float和double类型的数据在编程时的需要注意的地方 package execisetest; public class AccuranceTest {     public static vo ...

  5. 如何把double类型的数据转换为int类型的数据?

    方法1:强制转型 double a = 12.3; int b = (int)a; System.out.println(b); 结果: 12 方法2:使用封装类Double double a = 1 ...

  6. 转载——C语言中float,double类型,在内存中的结构(存储方式)

    最近在做一个数据格式分析和转换的项目,第一次接触底层的二进制代码存储,看的一头雾水,看到这个帖子后对于在Windows系统下数据的存储方式有了更多的了解,将原文分享一下: 原文地址为http://ww ...

  7. C语言的int, float,double相互转化 (从本质上理解可能的问题)

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/github_33873969/article/details/78040129 从学了C语言之后,一 ...

  8. java double 小数点后两位小数_Java中double类型的数据精确到小数点后两位

    Java中double类型的数据精确到小数点后两位 多余位四舍五入,四种方法 一: double f = 111231.5585; BigDecimal b = newBigDecimal(f);do ...

  9. 演示多组int,float,double的数与 2,2.0f,2.0d的除法运算和取模运算,如有兴趣,可自行分析对比结果

    因为各种基本数据类型所占用的存储空间各不相同,所以在进行各种计算时,有可能存在精度题.计算机的操作要在内存中进行,而内存容量有限:另一方面,持久化存储设备的存储空间也有限,内存中的数据可能需要持久化保 ...

最新文章

  1. python获取url参数 类继承_python之类的继承
  2. 逻辑运算符''取某值
  3. 面试之作用域链与闭包
  4. java Integer中隐藏的细节魔鬼!来自面试官的三轮暴击!
  5. Ubuntu系统如何安装nodejs及npm
  6. mint java_Linux Mint19安装jdk1.8.0.191过程
  7. 关于 SAP CRM 订单抬头级别的 Text 无法编辑的问题分析
  8. 用户体验设计的五个原则(转)
  9. 那些和闰年相关的 Bug
  10. 【今日CV 计算机视觉论文速览 第123期】Mon, 3 Jun 2019
  11. git入门与实践【转】
  12. 【Elasticsearch】Elasticsearch filter和query的不同
  13. Basis Cash公布V2路线图:将进行流动性迁移并将于Q3推出Basis Swap
  14. js webpack 配置路径_vue使用webpack配置路径别名
  15. 自定义tableView的section header/footerView时的view复用问题
  16. Google两步验证的工作原理
  17. 酷比魔方iwork8刷机shell_酷比魔方iwork8超级版双系统刷机教程,remix+Windows10,序列号i1开头数字结尾...
  18. 笑哭了!日本网友求助如何卸载360浏览器,过程堪比“ 拆弹 ”.....
  19. Squid 代理服务器应用
  20. 恒星物联-河道液位监测系统方案 液位监测

热门文章

  1. 100个Python实战项目(六)15 行代码进行人脸检测(使用Python 和 OpenCV)
  2. 广联达java_广联达软件研发面试
  3. Free Lunch for Few-shot learning:Distribution Calibration(ICLR 2021)详解
  4. Window user32子动态库控件封装和消息分发浅析
  5. 学计算机的运动会口号,计算机运动会口号三篇
  6. outlook显示imap服务器已关闭,outlook2010怎么老提示IMAP服务器已关闭连接啊
  7. smtp、pop3、IMAP是什么类型的服务器?
  8. VS平台中的stdafx.h文件
  9. Linux网络编程经典书籍推荐
  10. SpringAOP从入门到源码分析大全,学好AOP这一篇就够了(二)