关于c语言long long类型

你的小小栗子 2020-06-16 10:51:26
不知道为什么输出的是垃圾值,我的编译器是vs2010,32位的,不知道和这个有没有关系
...全文
261 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
chxchxkkk 2020-06-17
  • 打赏
  • 举报
回复
90625的平方太大了,溢出了
你的小小栗子 2020-06-17
  • 打赏
  • 举报
回复
谢谢各位兄弟
棉猴 2020-06-17
  • 打赏
  • 举报
回复
看一下反汇编的代码可能会更清楚一些
squ = 90625 * 90625;
对应的反汇编代码是
008018BE  mov         dword ptr [squ],0E986C401h  
008018C5  mov         dword ptr [ebp-8],0FFFFFFFFh 
可以看出,90625*90625的值应该是0x1E986C401,第一行汇编指令的作用是把0x1E986C401的低4个字节即0xE986C401值放到squ的低4个字节中去,因为E的最高位是1,所以第二行汇编指令把0xFFFFFFFF作为补充放到squ的高4个字节上去,此时squ的值是0xFFFFFFFFE986C401 而如果C代码是
squ = (long long)90625 * 90625;
此时对应的汇编指令是
005518BE  mov         dword ptr [squ],0E986C401h  
005518C5  mov         dword ptr [ebp-8],1 
第一行汇编代码没变,第二行是把0x1E986C401中多出来的1拷贝到squ的低4个字节中去,即此时squ的值是0x00000001E986C401
晚晶 2020-06-17
  • 打赏
  • 举报
回复
90625首先是int型,也就是说在赋值给squ之前,这是两个int型数据相乘,因此会有溢出。 所以建议这么写squ=(long long)90625*90625; 使得右边的表达式使用long long类型,这就可以正常获得结果了
Simple-Soft 2020-06-17
  • 打赏
  • 举报
回复
把90625也定义成long long,或者强制转换一下(long long)90625

70,037

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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