高分请教一个问题 在X86系统中,如下变量在内存中的字节存放顺序。DWORD Value1=0x8010011c UINT Value2=12801 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 如果是栈内对象,应该是你申明的顺序一样,Value1 在栈底部。Value2在栈顶部。 地址从小到大: 1C 01 10 80 (Value1) 01 32 00 00 (Value2) 可以用字节Copy来了解。或可以用联合来知道字节的存放顺序。 回复人: blackblue(跌跌撞撞) ( ) 信誉:100 2003-06-20 10:03:00 得分:0 地址从小到大: 1C 01 10 80 (Value1) 01 32 00 00 (Value2) 你能给出为什么会是上面的结果吗? 我觉得是10 80 1c 01 (value1)01 32 00 00 (value2)x86中存放数据回自动把颠倒顺序,但在读取时,又回还原 正确解释应该是这样的吧:数据在内存中的存放形式应该是从低字节开始到高字节的,所以在x86系统(我也不知道那到底是一个什么样的系统,希望有人难给出一个准确的定义,哎,白读了四年的计算机本科啊)中,DWORD(unsigned long)和UINT(unsigned int)都是占用四个字节的吧,若是的话,就应该是下面这样的:(从低字节--->高字节)80 10 01 1C (Value1)00 00 32 01 (Value2)望高手指教! 那应该是:(从高字节--->低字节)00 00 32 01 (Value2)80 10 01 1C (Value1) 以字节为单位,颠倒放置,即:WORD 类型:低字节在前,高字节在后DWORD 类型:低字在前,高字在后。每个字内如WORD类型放置。80X86就是这样的,没有为什么。用下面函数看看,一个字或双字在内存中的放置情况:// 功能: 将一个字节数组格式化为一个二进制字符串// 入口: pszStr :字符串数组的指针,nLen 字符串长度// pByte : 字节数组指针, nSize :字节数组大小// 出口: pszStr : 格式化后的字符数组指针// 示例: 8 - > "00001000"bool FormatBin(PTSTR pszStr, int nLen, BYTE* pByte, int nSize){ if (nSize*8+1 > nLen) return false; BYTE Mask = 0x80; for (int n=0; n<nSize; n++, pByte++) { for(int k=0; k<8; k++) { *pszStr++ = ((*pByte)&(Mask>>k)) ? '1' : '0'; } } *pszStr = '\0'; return true;}//测试:DWORD dw = 12;DWORD w = 13;TCHAR strDW[40];TCHAR strW[20];FormatBin(strDW, 40, &dw, sizeof(DWORD);FormatBin(strW, 20, &w, sizeof(WORD));//看看strDW, strW中是什么? 低字节在前(即低字节在低地址)以0x8010011c为例, 应为1c 01 10 80 经调试后,得到的结果是这样的:内存变量先定义就先分配,这个没错吧所以(从高字节--->低字节)80 10 01 1C (Value1)00 00 32 01 (Value2)是没错的 运行错误怎么解决啊 cstring m_pConnection->Open问题 请教一个关于 实现Box类的问题 谢谢 高手,怎么在xp下实现定时关机!最好用自己编的小程序完成。 请高手指点这些错误提示该如何解决。在别人的机器上编译都可以,在我的机器上却不行。 开发文本框控件,如何检测输入的是否汉字? 请哪位大虾看看如下的代码 请问BS是什么? 端口扫描用CONNECT连接和用TCP SYN包在结果上是否等同? 如何使用true type字体 Windows Symbol Packages有什么作用? 借人气问一下,怎样使自己开的FTP支持断点续传?
01 32 00 00 (Value2)
地址从小到大: 1C 01 10 80 (Value1)
01 32 00 00 (Value2)
你能给出为什么会是上面的结果吗?
10 80 1c 01 (value1)
01 32 00 00 (value2)
x86中存放数据回自动把颠倒顺序,但在读取时,又回还原
数据在内存中的存放形式应该是从低字节开始到高字节的,所以在x86系统(我也不知道那到底是一个什么样的系统,希望有人难给出一个准确的定义,哎,白读了四年的计算机本科啊)中,DWORD(unsigned long)和UINT(unsigned int)都是占用四个字节的吧,若是的话,就应该是下面这样的:
(从低字节--->高字节)
80 10 01 1C (Value1)
00 00 32 01 (Value2)望高手指教!
80 10 01 1C (Value1)
DWORD 类型:低字在前,高字在后。每个字内如WORD类型放置。80X86就是这样的,没有为什么。用下面函数看看,一个字或双字在内存中的放置情况:// 功能: 将一个字节数组格式化为一个二进制字符串
// 入口: pszStr :字符串数组的指针,nLen 字符串长度
// pByte : 字节数组指针, nSize :字节数组大小
// 出口: pszStr : 格式化后的字符数组指针
// 示例: 8 - > "00001000"
bool FormatBin(PTSTR pszStr, int nLen, BYTE* pByte, int nSize)
{
if (nSize*8+1 > nLen) return false;
BYTE Mask = 0x80;
for (int n=0; n<nSize; n++, pByte++)
{
for(int k=0; k<8; k++)
{
*pszStr++ = ((*pByte)&(Mask>>k)) ? '1' : '0';
}
}
*pszStr = '\0';
return true;
}
//测试:DWORD dw = 12;
DWORD w = 13;
TCHAR strDW[40];
TCHAR strW[20];
FormatBin(strDW, 40, &dw, sizeof(DWORD);
FormatBin(strW, 20, &w, sizeof(WORD));
//看看strDW, strW中是什么?
以0x8010011c为例, 应为1c 01 10 80
内存变量先定义就先分配,这个没错吧所以
(从高字节--->低字节)80 10 01 1C (Value1)
00 00 32 01 (Value2)是没错的