字节顺序问题求教

CaesireKin 2013-09-10 05:10:41
最近学习C++的时候遇到了一个令人费解的问题,调用addBytes函数的时,给该函数传递了一个int类型的数值,定义如下:
int i = 16975631;//二进制:00000001 00000011 00000111 00001111
然后调用addBytes函数,函数定义如下:
//Mem.h
typedef unsigned char byte;
...
private:
byte* bytes;
...
//Mem.cpp
void Mem::addBytes(void* element,int sizeOfBytes)
{
//ensureSize(this->size + sizeOfBytes);//请忽略此行,该行用于给byte扩容
byte* e = (byte*)element;
for(int i = 0; i < sizeOfBytes; i++)
{
cout << (int)e[i] << endl;
this->bytes[i] = e[i];
}
}
但是,不知道因何原因,e[0]的二进制总是00001111,也就是原本i中的第四个字节的数据
表达的可能不清晰,烦请看懂的前辈们指点一二,谢谢
...全文
127 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-09-11
  • 打赏
  • 举报
回复
如果程序只在一种平台运行,只需要那种平台的字节序就成. 如果跨平台,检测一下平台,做一下转换.
CaesireKin 2013-09-10
  • 打赏
  • 举报
回复
引用 7 楼 ananluowei 的回复:
[quote=引用 5 楼 chn3698 的回复:] [quote=引用 3 楼 ananluowei 的回复:] 小端方式 int4个字节在内存中是低位在前,高位在后的。
那我在请教一下,我一开始也是这么想的,但是我后面再把bytes取出来,转换成int,结果却不是原来的结果,这个。。。该怎么破。。。[/quote] 你传1个int给addBytes,函数的参数是void* element 你在函数内直接把element强转为int*不就可以了? int x = *(int*)element;[/quote] 用void*主要还是希望保存不止一种类型的数据,还没学到模版,所以暂时打算先把这种方式用熟悉
大尾巴猫 2013-09-10
  • 打赏
  • 举报
回复
引用 5 楼 chn3698 的回复:
[quote=引用 3 楼 ananluowei 的回复:] 小端方式 int4个字节在内存中是低位在前,高位在后的。
那我在请教一下,我一开始也是这么想的,但是我后面再把bytes取出来,转换成int,结果却不是原来的结果,这个。。。该怎么破。。。[/quote] 你传1个int给addBytes,函数的参数是void* element 你在函数内直接把element强转为int*不就可以了? int x = *(int*)element;
赵4老师 2013-09-10
  • 打赏
  • 举报
回复
void HexDump(char *buf,int len) {
    int i,j,k;
    char binstr[80];

    for (i=0;i<len;i++) {
        if (0==(i%16)) {
            sprintf(binstr,"%04x -",i);
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        } else if (15==(i%16)) {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
            sprintf(binstr,"%s  ",binstr);
            for (j=i-15;j<=i;j++) {
                sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
            }
            printf("%s\n",binstr);
        } else {
            sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);
        }
    }
    if (0!=(i%16)) {
        k=16-(i%16);
        for (j=0;j<k;j++) {
            sprintf(binstr,"%s   ",binstr);
        }
        sprintf(binstr,"%s  ",binstr);
        k=16-k;
        for (j=i-k;j<i;j++) {
            sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');
        }
        printf("%s\n",binstr);
    }
}
CaesireKin 2013-09-10
  • 打赏
  • 举报
回复
引用 3 楼 ananluowei 的回复:
小端方式 int4个字节在内存中是低位在前,高位在后的。
那我在请教一下,我一开始也是这么想的,但是我后面再把bytes取出来,转换成int,结果却不是原来的结果,这个。。。该怎么破。。。
nice_cxf 2013-09-10
  • 打赏
  • 举报
回复
搜索大小端,如果你想跨平台,传入的时候要用char[4]而不是int
大尾巴猫 2013-09-10
  • 打赏
  • 举报
回复
小端方式 int4个字节在内存中是低位在前,高位在后的。
CaesireKin 2013-09-10
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
谢谢,我会按照您的建议多查阅一些资料的,另外也谢谢您告诉我如何查看汇编和堆栈的信息,因为C++不熟悉,所以很多C++调试的方法我都不甚了解,不过不知您能否帮忙解释下这段代码存储数据的时候内容会倒过来的问题?
赵4老师 2013-09-10
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

64,676

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧