short 与 short 相乘,结果是?

2009-07-31 10:43:29
short 为 16bit,int 为 32bit。

int CalculateDotProduct_c(const short * pA, const short * pB, int nOrder)
{
int nDotProduct = 0;

while (nOrder--)
{
nDotProduct += *pA++ * *pB++;
}

return nDotProduct;
}

编译以后,“nDotProduct += *pA++ * *pB++;”一句,得到这个(注释是自己分析后加的):

mov eax, DWORD PTR [ebp+8] ;载入pA
movzx eax, WORD PTR [eax] ;载入*pA
movsx edx, ax ;*pA作符号扩展
mov eax, DWORD PTR [ebp+12] ;载入pB
movzx eax, WORD PTR [eax] ;载入*pB
cwde ;继续扩展
imul eax, edx ;明显是 32bit 乘法
add DWORD PTR [ebp-4], eax ;直接加 32bit 结果到 nDotProduct

难道 short * short 不应该是 short,而是 int?
麻烦回答的时候“引经据典”一下,讲清楚理由。
谢过
...全文
623 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
malganis00 2009-07-31
  • 打赏
  • 举报
回复
楼上解释的可以,清晰明了。 估计能够回答lz的问题了
ForestDB 2009-07-31
  • 打赏
  • 举报
回复
首先short被提升至int做运算,结果就是int,至于最后是什么,要看你赋给谁,比如你又赋回给short,那么int就被cast成short。
sunm42000 2009-07-31
  • 打赏
  • 举报
回复
两个short型都先被提升为int 进行减运算吧
v2002750 2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 taodm 的回复:]
楼主没认真看过基础教材。
数学运算都至少提升到int后才进行的。
[/Quote]
这个真是不知道哦。那short - short也是一个int吗?
sunm42000 2009-07-31
  • 打赏
  • 举报
回复
lz 比我强大多了 当时我看书的时候就没想到这个问题。。。。。恩 受教了
楼上几位正解 提升为int类型
Vegertar 2009-07-31
  • 打赏
  • 举报
回复
与左值是否为 int 无关。
taodm 2009-07-31
  • 打赏
  • 举报
回复
楼主没认真看过基础教材。
数学运算都至少提升到int后才进行的。
2009-07-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 v2002750 的回复:]
如果是SHORT就很容易出现溢出了,2字节*2字节,肯定要用一个4字节来存放结果了。
[/Quote]
这是从操作上来讲,但从语句本来的意思出发,不应该是 short 吗?
Vegertar 2009-07-31
  • 打赏
  • 举报
回复
short, char, bool 的整类型进行算术运算会自动提升为 int
lori227 2009-07-31
  • 打赏
  • 举报
回复
nDotProduct 你定义的是int. 所以两个short 要先扩展,否则有可能会溢出,得到的就不是期望的结果
v2002750 2009-07-31
  • 打赏
  • 举报
回复
如果是SHORT就很容易出现溢出了,2字节*2字节,肯定要用一个4字节来存放结果了。
2009-07-31
  • 打赏
  • 举报
回复
谢谢大家,好久不用 short,都忘得差不多了,今天受教了。

64,643

社区成员

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

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