标题:新手的问题就是多啊 问题到底出在哪?
只看楼主
y41699060
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2011-5-8
结帖率:66.67%
 问题点数:0 回复次数:2 
新手的问题就是多啊 问题到底出在哪?
/* 2.14 */
#include<stdio.h>

int main(void)
{
  const float revenue_per_150=4.5f;
  short jansold=23500;
  short febsold=19300;
  short marsold=21600;
  float revquarter=0.0f;

  long quartersold=jansold+febsold+marsold;

  printf("stock sold in\n jan: %d\n feb: %d\n mar: %d\n",
           jansold,febsold,marsold);
  printf("total stock sold in first quarter: %ld\n",quartersold);

  revquarter=quartersold/150*revenue_per_150;
  printf("sales revenue this quarter is:$%.2f\n",revquarter);
  getch();
  return 0;
}
输出结果因该是
stock sold in
jan:23500
feb:19300
mar:21600
total stock sold in first quarter:64400
sales revenue this quarter is :$1930.50
 我完全照书上打的
 可为什么到我实际执行
total stock sold in first quarter:-1136
sales revenue this quarter is :$-31.50
成两负数了啊????

[ 本帖最后由 y41699060 于 2011-5-9 20:37 编辑 ]
搜索更多相关主题的帖子: total include quarter revenue 
2011-05-09 19:51
tisyang
Rank: 8Rank: 8
等 级:蝙蝠侠
帖 子:132
专家分:737
注 册:2011-5-7
得分:0 
short 应该是溢出了,据我所知,32位编译器上,除了gcc的 shrot 是四个字节外,其他的比如vc的short 是两个字节。
两字节short能表达的范围是 -32768~32767, 就算是无符号,能表达的最大值也只是 65535。
long quartersold=jansold+febsold+marsold;
这条语句,后面的加法已经溢出了,虽然计算结果放进一个long变量中,但是放入的是一个已经成为负数的short的变量了。
不知道你明白了没有,如果书上例子结果是正的,说明使用的可能是gcc编译器,而你使用的是将short作为二字节处理的编译器,所以结果会不相同。
以下是gcc的编译运行结果:
$ ./temp.exe
stock sold in
 jan: 23500
 feb: 19300
 mar: 21600
total stock sold in first quarter: 64400
sales revenue this quarter is:$1930.50

C++ 用无参数构造函数生成对象时候请勿在构造函数后添加无用的那一对括号,否则有可能会被当成函数声明而忽略,嗯,栈上构建的时候就是这样。
2011-05-09 20:56
y41699060
Rank: 1
等 级:新手上路
帖 子:33
专家分:0
注 册:2011-5-8
得分:0 
谢谢 你讲的很清楚  让我了解的问题根本了!! 难怪我用INT定义 一样也是负数 因为不知道是系统还是编译器的原因 INT也被定义成二字节  看来这题只能把所有的short全用long定义
2011-05-09 21:01



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-339329-1-1.html




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

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