深层次问题,估计多数人也没有碰到过,可能关于字节对齐方式的,近来看看。

chenyf 2003-09-27 02:21:50
我原来有一套C程序,后来和VC++混合,将其移植到了windows平台上,
即C,C++混合起来编程,用extern "C"定义两者间的接口,通过,运行正常,
但是有一个问题:如下:
unsigned char j=2;
void Fun1()
{
unsigned short i;
i=0;
i = Fun2();
//此时i==0xcc02!!!需要i = 0x00FF&i;才会变成2,
//如果写成i=2;则正常。
}
unsigned char Fun2()
{
return j;
}
我觉得可能是编译器字节对齐方式的问题,可我查了cl的帮助,没有对齐方式的选项。
...全文
63 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
chenyf 2003-10-07
  • 打赏
  • 举报
回复
那我岂不是要改动很多代码,我想知道问题的原因所在啊。
zx_sanjin 2003-10-06
  • 打赏
  • 举报
回复
试试 unsigned char temp = Fun2(); temp的结果对不对。
然后 unsigned short i = temp; 看看结果是多少?

突然觉得自己很伟大,象医生,哈哈~~
chenyf 2003-10-06
  • 打赏
  • 举报
回复
很不幸的告诉各位,强制转换不行。
仍然是0xcc02。
weijiechen 2003-09-28
  • 打赏
  • 举报
回复
有意思!!
wangbab 2003-09-28
  • 打赏
  • 举报
回复
学习。
liangbch 2003-09-28
  • 打赏
  • 举报
回复
同意awant2k
awant2k 2003-09-28
  • 打赏
  • 举报
回复
unsingned char Fun2()的返回值 是8位,存放在寄存器底位,高位取的是j的下一个字节,DEBUG是 0xcc(RELEASE是0), 如果没有强制转换,则把该寄存器直接复制给了 i, 因为该寄存器也是16位的。如果是强制转换,则编译器会把低位扩展成16位,从而把高位清零
awant2k 2003-09-28
  • 打赏
  • 举报
回复
其实跟 字节对齐 也有关系 的, DEBUG版 会在 j 后面添加 0xcc (RELEASE添加 0)到符合对齐
这时候隐式转换只是把 j 连续 2个字节 复制给 i, 强制转换则不会。
awant2k 2003-09-28
  • 打赏
  • 举报
回复
象这种隐式转换会出现这种情况,应该用强制转换
i = (unsigned short)Fun2();
ringphone 2003-09-28
  • 打赏
  • 举报
回复
不是字节对齐问题。
你用的是DEBUG方式编译的吧?VC的DEBUG模式会把未赋初值的变量以0xCC填充,Fun2里return j;j是char,单字节,赋给short类型需要扩充,VC自动把未赋初值的部分填充CC,所以i==0xcc02。你用Release编译就应该没问题。
chenyf 2003-09-27
  • 打赏
  • 举报
回复
我rebuild n把啦。
oo 2003-09-27
  • 打赏
  • 举报
回复
建议你rebuild all一把。
chenyf 2003-09-27
  • 打赏
  • 举报
回复
另:我用VC开了一个Console空工程,编了个小程序试试,发现不是如此。
和预想的相同!
chenyf 2003-09-27
  • 打赏
  • 举报
回复
看诸大哥如此热心,兄弟我谢了先!
代码就是如上所示的。
//////////////////////////////////////
extern unsigned char Fun2()
void Fun1()//原来C语言中的代码。
{
unsigned short i;
i=0;
i = Fun2();
//此时i==0xcc02!!!需要i = 0x00FF&i;才会变成2,
//如果写成i=2;则正常。
}
/////////////////////////////////////////
unsigned char j=2; //在C++中用extern "C"定义。全局变量。
unsigned char Fun2()//在C++语言中定义和声明。
{
return j;
}
wuxfBrave 2003-09-27
  • 打赏
  • 举报
回复
给出你的具体代码看呢,给个demo啊
farfh 2003-09-27
  • 打赏
  • 举报
回复
用 debug跟踪看一下内存是什么样的看看
studyingpersons 2003-09-27
  • 打赏
  • 举报
回复
借用贵宝地!
http://expert.csdn.net/Expert/topic/2306/2306268.xml?temp=.4389612
krosjean 2003-09-27
  • 打赏
  • 举报
回复
unsigned short是16位的没错 可为什么高八位就成了cc呢?
sssxueren 2003-09-27
  • 打赏
  • 举报
回复
同意,unsigned short是16位的
gaosl11 2003-09-27
  • 打赏
  • 举报
回复
你返回的是char,8位的。当然是这个结果。
加载更多回复(4)

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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