| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 416 人关注过本帖
标题:请教高手一个C语言运算(可能是数据类型)的问题
只看楼主 加入收藏
lanpad
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-10-20
收藏
 问题点数:0 回复次数:5 
请教高手一个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
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
没啥问题呢   你这变量名起的太闹心了   都不如看abcdefg 看着舒服

程序代码:
#include <stdio.h>

int main()
{
    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 & 0xffff);  //低16位
    printf("H16=%X   L16=%X\n",C_sum_H,C_sum_L);
    C_sum_test = 10*61380;
    C_sum_test_H = (C_sum_test >>16);  //高16位
    C_sum_test_L = (C_sum_test & 0xffff);            //低16位
    printf("H16=%X   L16=%X\n",C_sum_test_H,C_sum_test_L);
    return 0;
}

DO IT YOURSELF !
2015-12-01 13:25
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
你的编译器有bug
C_sum_test = 10*61380 时,直接使得 C_sum_test 等于 613800,这是不正确的。因为 int * unsigned int的结果类型应该是 unsigned int,而 613800 已经是 long 型了。

如果你用符合标准的编译器(还要这鸟编译器的int是16位的),那么两段代码结果应该一致
即,低16位是 0x5DA8,高16位是 0x0000(既不是9也不是-11)

2015-12-01 13:56
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
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
加unsigned 就是代表 无符号  否则就是有符号  

DO IT YOURSELF !
2015-12-01 14:36
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.092157 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved