请教高手一个C语言运算(可能是数据类型)的问题

lanpad 2015-12-01 01:00:17
void cons_calc(int ID) {

unsigned int A_cnt;
long C_sum;
unsigned int C_sum_H , C_sum_L, C_sum_test_H , C_sum_test_L;
long C_sum_test;
......
......
......
A_cnt = 10;
......
......
......
C_sum = A_cnt *61380; //正确结果应为613800或0x95DA8
C_sum_H = (C_sum >>16); //高16位
C_sum_L = (C_sum ); //低16位

C_sum_test = 10*61380;
C_sum_test_H = (C_sum_test >>16); //高16位
C_sum_test_L = (C_sum_test ); //低16位
......
......
......

}

按理说,C_sum 低16位C_sum_L输出 正确,高16位C_sum_H应为9,可实际却输出为-11(16进制察看是FFF5),为何会输出这样的结果?
而为什么立即数C_sum_test = 10*61380;运算时,C_sum_test _H的结果却是对的?(C_sum_test _H经验证为9)
...全文
120 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
flying_music 2015-12-01
  • 打赏
  • 举报
回复
flying_music 2015-12-01
  • 打赏
  • 举报
回复
楼主用的什么编译器啊,VS输出全部正确啊,而且类型应该用unsigned short int吧,否则无法提取低16位啊
zhouxiaofeng1021 2015-12-01
  • 打赏
  • 举报
回复
C_sum = A_cnt *61380; //正确结果应为613800或0x95DA8 C_sum_H = (C_sum >>16); //高16位 C_sum_L = (C_sum ); //低16位 C_sum_test = 10*61380; C_sum_test_H = (C_sum_test >>16); //高16位 C_sum_test_L = (C_sum_test ); //低16位 这段代码你进入内存看看呗 调试中有个内存窗口~~~看看对不对撒
lanpad 2015-12-01
  • 打赏
  • 举报
回复
引用 1 楼 zhao4zhong1 的回复:
理解讨论之前请先学会如何观察! 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 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对应的汇编并单步执行观察相应内存和寄存器变化。)
能这么一点点看早OK了 在其他开发环境里根本没这个问题。 这是基于一个叫ZSP IDE的DSP开发环境的 程序,很差劲的 ,没那些调试手段
赵4老师 2015-12-01
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察! 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 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对应的汇编并单步执行观察相应内存和寄存器变化。)

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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