c++中的字节序与符号位的问题

目录
  • c++的字节序与符号位
  • c++多字节值与字节序
    • 多字节值与字节序
    • 对于跨平台应用,字节序的两种处理方式
    • 字节序的判断
    • 整数字节序的转换
    • 浮点数的字节序转换

c++的字节序与符号位

看这样一道题:

#include <stdio.h>
int main(void) 
{
    int w, h;
    int i = 0xa1b2c3d4;
    char *p = (char *)&i;
    for (int j = 0; j < 4; j++)
    {
        char c = p[j];
        printf("%02x\n", c);
    }
    return 0;
}

输出结果是什么?

ffffffd4
ffffffc3
ffffffb2
ffffffa1

char只有一个字节,打印出来却是4个字节,与想象的不一样啊,

如果改动一下就对了,

#include <stdio.h>
int main(void) 
{
    int w, h;
    int i = 0xa1b2c3d4;
    unsigned char *p = (unsigned char *)&i;
    for (int j = 0; j < 4; j++)
    {
        unsigned char c = p[j];
        printf("%02x\n", c);
    }
    return 0;
}

d4
c3
b2
a1

这是因为:

1)在x86平台是littelEndian字节序,所以会倒序,先遍历到低位;

2)char 类型等于是有符号,在打印时候,会将高位按照符号位补全1,所以会打印多余的FF,这里与printf的实现有关

c++多字节值与字节序

多字节值与字节序

大于8位(一字节)的值称为多字节量,在内存中存储多字节量有两种方式:

小端:处理器储存多字节值的最低有效字节于较低的内存位置,则该微处理器就是小端处理器;

大端:微处理器储存多字节值的最高有效字节于较低的内存位置,则该处理器为大端处理器。

对于跨平台应用,字节序的两种处理方式

  • 所有数据以文字的方式写入文件;多字节数值以一串十进制数字,每个数字一个的写入,这会浪费磁盘空间。
  • 工具先转换字节序,然后再把转换后的数据写进二进制文件。

字节序的判断

/*
*返回1小端
*返回0是大端
*/

int check_sys()
{
    int i = 1;
    return ((char)&i);
}

整数字节序的转换

typedef unsigned short U16;
typedef unsigned int U32;

U16 swapU16(U16 value)
{
	return ((value & 0xFF00) >> 8 ) | ( (value & 0x00FF) << 8 );
}

U32 swapU32(U32 value)
{
	return ( (value & 0x000000FF) << 24 )
		| ( (value & 0x0000FF00) << 8 )
		| ( (value & 0x00FF0000) >> 8 )
		| ( (value & 0xFF000000) >> 24 );
}

浮点数的字节序转换

虽然浮点数有详细的内部结构,其中某些位作为尾数,有些位作为指数,并还有一个符号位,虽然其结构复杂,但仍然可以把浮点数当作整数转成字节序:

typedef unsigned short U16;
typedef unsigned int U32;
typedef float F32;

union  U32F32
{
	U32 m_asU32;
	F32 m_asF32;
};

U32 swapU32(U32 value)
{
	return ( (value & 0x000000FF) << 24 )
		| ( (value & 0x0000FF00) << 8 )
		| ( (value & 0x00FF0000) >> 8 )
		| ( (value & 0xFF000000) >> 24 );
}

F32 swapF32(F32 value)
{
	U32F32 u;
	u.m_asF32 = value;
	u.m_asU32 = swapU32(u.m_asU32);
	return u.m_asF32;
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C++有符号和无符号之间的转换问题

    先来看一个程序: #include<iostream> int main() { unsigned a=5; int b=-10; std::cout<<b+b<<std::endl;//正常输出 std::cout<<a+b<<std::endl; return 0; } 打印:-20 4294967291 -20正常打印我们都知道,但当一个有符号和一个无符号之间的数进行相加减会发生什么呢? 是这样的:a+b,首先把负数转换为无符号数,然后在进

  • C++位运算符详解(异或运算符和移位运算符)

    什么是位运算 位运算符按二进制进行运算,这些运算符只能用于整数类型的操作.如:char,short,int,long 通过位运算符来获取高位值和低位值 int a=0x1234; int high,low; high = (a>>8) &0x00ff; low = a & 0x00ff; 左移运算符和右移运算符(<<和>>) 左移是将一个二进制数,移动若干位,右边空出的位置用0来填补,高位左移溢出应该舍弃该高位. 如:inta = 8, a = 0000

  • C++解析特殊符号tab、换行符号实例代码

    前言: 我们经常会遇到一些Linux内核信息需要,比如一个wifi数据,中间是用tab键盘隔开的,然后每一行用换行符进行区分,如下所示的数据 第一位置是:wifi名称 第二个位置是:信号强度 第三个位置是:信号类型2.4Ghz或者5Ghz 第四个位置是:加密类型 第五个类型是:MAC地址 遇到这样的数据,我们比较常见的C函数解析是用while循环去匹配字符串里面的'\t'(tab键),'\n'(换行符号)等,然后用C标准库里面str函数,例如strncpy进行复制或者strstr去查找,类似于下

  • C++浮点数类型详情

    目录 1.浮点数 2.关于m 3.关于e 4.浮点数的使用 5.浮点数类型 6.注意事项 1.浮点数 浮点数是C++的第二组基本类型,它能够表示带小数部分的数字.不仅如此,浮点数的范围也比int更大,可以表示更大范围的数字. 我们都知道在计算机当中,所有数据本质上都是转化成二进制存储的.整数很简单,存储的就是转化成二进制之后的01串,那么浮点数又是如何存储的呢? 很容易猜到的是浮点数存储的结果也是二进制,但相比于整型直接转化成二进制要复杂一些. 它需要先表示成下面这行式子: 这里的n即我们要存储

  • c++中的字节序与符号位的问题

    目录 c++的字节序与符号位 c++多字节值与字节序 多字节值与字节序 对于跨平台应用,字节序的两种处理方式 字节序的判断 整数字节序的转换 浮点数的字节序转换 c++的字节序与符号位 看这样一道题: #include <stdio.h> int main(void)  {     int w, h;     int i = 0xa1b2c3d4;     char *p = (char *)&i;     for (int j = 0; j < 4; j++)     {   

  • 详谈Java中的二进制及基本的位运算

    二进制是计算技术中广泛采用的一种数制.二进制数据是用0和1两个数码来表示的数.它的基数为2,进位规则是"逢二进一",借位规则是"借一当二",由18世纪德国数理哲学大师莱布尼兹发现.当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的.计算机中的二进制则是一个非常微小的开关,用"开"来表示1,"关"来表示0. 那么Java中的二进制又是怎么样的呢?让我们一起来揭开它神秘的面纱吧. 一.Java内置的进

  • 数据结构基本概念和术语之位字节、字、位串、元素等

    数据结构基本概念和术语:位.字节.字.位串.元素.数据域.物理结构.逻辑结构 位(Bit):"位(bit)"是电子计算机中最小的数据单位.每一位的状态只能是0或1. 字节(Byte):8个二进制位构成1个"字节(Byte)",它是存储空间的基本计量单位.1个字节可以储存1个英文字母或者半个汉字,换句话说,1个汉字占据2个字节的存储空间. 字:"字"由若干个字节构成,字的位数叫做字长,不同档次的机器有不同的字长.例如一台8位机,它的1个字就等于1个

  • PHP INT类型在内存中占字节详解

    本教程将介绍输出INT类型在内存中占多少个字节 新建一个333.php,如图所示: 添加php的界定符(<?php?>),如图所示: 声明PHP与浏览器交互的文件类型和编码,如图所示: 使用常量 PHP_INT_SIZE 来获取INT类型在内存中占多少个字节,如图所示: 使用 echo 语句输出常量 PHP_INT_SIZE 获取到的字节数,如图所示: 运行网页,在浏览器上显示获取到的结果,如图所示: section id="smaller-text-left-7">

  • C/C++字节序的深入理解

    目录 字节序 大端序 小端序 主机字节序和网络字节序 大端序和小端序的互转 字节序 最近在看 redis 的内存编码,里面涉及到字节序相关的内容.这里就当复习一下,做个简单的回顾. 数据存储在内存中,是以字节为单位的,如果是单字节数据(如char.unsigned char.int8)就不会有字节序的问题.但是多字节数据(如 int.float.double)就要考虑字节序的问题了.字节序共分为两种:大端序 和 小端序. 大端序 数据的高位字节存储在地址的低端:低位字节存储在地址的高端.如图所示

  • VBScript 中的字节数据操作函数

    Asc 和 AscB.AscW Asc 函数返回与字符串的第一个字母对应的 ANSI 字符代码. Asc(string) AscB 函数和包含字节数据的字符串一起使用.AscB 不是返回第一个字符的字符代码,而是返回首字节. AscW 是为使用 Unicode 字符的 32 位平台提供的.它返回 Unicode (宽型)字符代码,因此可以避免从 ANSI 到 Unicode 的代码转换. Chr 和 ChrB.ChrW Chr 函数返回与指定的 ANSI 字符代码相对应的字符. Chr(char

  • C语言中无符号数和有符号数之间的运算

    C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了. unsigned int和int进行运算 直接看例子来说明问题吧 #include <iostream> using namespace std; int main() { int a = -1; unsigned int b = 16; if(a > b) cout<<"负数竟然大于正数了!\n";

  • 基于大端法、小端法以及网络字节序的深入理解

    关于字节序(大端法.小端法)的定义<UNXI网络编程>定义:术语"小端"和"大端"表示多字节值的哪一端(小端或大端)存储在该值的起始地址.小端存在起始地址,即是小端字节序:大端存在起始地址,即是大端字节序. 也可以说: 1.小端法(Little-Endian)就是低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端. 2.大端法(Big-Endian)就是高位字节排放在内存的低地址端即该值的起始地址,低位字节排放在内存的高地址端.举

  • Java整型数与网络字节序byte[]数组转换关系详解

    本文实例讲述了Java整型数与网络字节序byte[]数组转换关系.分享给大家供大家参考,具体如下: 工作项目需要在java和c/c++之间进行socket通信,socket通信是以字节流或者字节包进行的,socket发送方须将数据转换为字节流或者字节包,而接收方则将字节流和字节包再转换回相应的数据类型.如果发送方和接收方都是同种语言,则一般只涉及到字节序的调整.而对于java和c/c++的通信,则情况就要复杂一些,主要是因为java中没有unsigned类型,并且java和c在某些数据类型上的长

  • 解决Oracle字符串中包含数字、特殊符号的排序问题

    问题描述: 某小区,需要按照小区.楼栋.单元号.房间号进行排序,但是按照地址描述排序时,因为字符串中包含数字,所以造成了如下的结果, 1号楼之后应该是2号楼,但是查询结果却是10号楼 . 尝试解决 使用正则表达式替换 结果: 虽然楼栋号排序正常了,但是会发现房间号排序出现了混乱.  继续想办法 终极办法: 使用translate函数 可以发现,结果正常显示 . 以下附上translate使用方法 一.语法: TRANSLATE(string,from_str,to_str) 二.目的 返回将(所

随机推荐