| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 416 人关注过本帖
标题:请教高手一个C语言运算(可能是数据类型)的问题
取消只看楼主 加入收藏
lanpad
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-10-20
收藏
 问题点数:0 回复次数:2 
请教高手一个C语言运算(可能是数据类型)的问题
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)
搜索更多相关主题的帖子: C语言 
2015-12-01 13:16
lanpad
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-10-20
收藏
得分:0 
回复 3楼 rjsp
多谢!

我又试了几次,加一个强制类型转换就可以了

将“ C_sum  = A_cnt *61380;        //正确结果应为613800或0x95DA8”

改为

“ C_sum  = (unsigned long)A_cnt *61380;”或
“ C_sum  = A_cnt *(unsigned long)61380;”

就正确了

必须是“(unsigned long)”
“(long)”都不对

不知道怎么回事?


ps:开发环境:ZSP IDE (integrated development environment) 基于GCC3.0编译器,
根据软件中提供的文档,该版本的GCC(GNU Compiler Collection)主要支持C89标准。


[此贴子已经被作者于2015-12-1 14:45编辑过]

2015-12-01 14:35
lanpad
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-10-20
收藏
得分:0 
回复 5楼 wp231957
但613800应该远没有到long的最大范围,最高位应当是0的
2015-12-01 14:44
快速回复:请教高手一个C语言运算(可能是数据类型)的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030535 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved