【问题标题】:Weird results using simple math operations使用简单的数学运算得出奇怪的结果
【发布时间】:2013-11-09 11:44:42
【问题描述】:

我有以下结构:

typedef struct number
{
    int x;
    int y;
    int z;
    unsigned long int final;
}number;

我的代码如下:

number* numbers;
numbers= (number*)malloc(sizeof(number));
scanf("%d %d %d", &numbers->x, &numbers->y, &numbers->z);
printf("input: %d,%d,%d\n",numbers->x, &numbers->y, &numbers->z);
numbers->final=(numbers->x)*4000 + (numbers->y)*50 + (numbers->z);
printf("final: %d",numbers->final);

但输出错误。例如这里是一个运行:

12 12 12
input: 12,12,12
final: -28640

我无法弄清楚问题所在。 number->final 可以得到的最高数字是 90,000 (我在给出输入时确保它)...我似乎有重叠?请帮忙。

【问题讨论】:

  • finalunsigned 并且您在 printf 中使用 %d 用于签名 ints。
  • 粘贴的代码副本与输出无关,请粘贴您的真实代码。
  • 如果我可以使用打印屏幕,我会拥有,但我不能,因为网站不允许我这样做。
  • 复制/粘贴您的真实代码,上面的内容不一致(例如 printf 行混合了值和指针)。确保将编译器的警告打开到最高级别。

标签: c


【解决方案1】:

你的问题是指针。我假设你初始化结构如下。

numbers *numbers;

但是,如果您在声明它的 main 中使用它,则不要使用指针。您的 printf 调用中也有一些错误,您打印的是 y 和 z 的内存地址,而不是像 x 值那样打印的值。

使用类似的东西。

#include <stdio.h>

typedef struct number
{
    int x;
    int y;
    int z;
    unsigned int final;
} number;

int main()
{
  number numbers;

  scanf("%d %d %d", &numbers.x, &numbers.y, &numbers.z);
  printf("input: %d,%d,%d\n",numbers.x, numbers.y, numbers.z);
  numbers.final=(numbers.x)*4000 + (numbers.y)*50 + (numbers.z);
  printf("final: %d\n",numbers.final);

  return 0;
}

没错,如果你使用 malloc,它看起来像这样。

#include <stdio.h>
#include <stdlib.h>

typedef struct number
{
    int x;
    int y;
    int z;
    unsigned int final;
} number;

int main()
{
  number *numbers = malloc(1 * sizeof(number));

  scanf("%d %d %d", &numbers->x, &numbers->y, &numbers->z);
  printf("input: %d,%d,%d\n",numbers->x, numbers->y, numbers->z);
  numbers->final=(numbers->x)*4000 + (numbers->y)*50 + (numbers->z);
  printf("final: %d\n",numbers->final);

  free(numbers);

  return 0;
}

运行示例here

【讨论】:

  • 在这种情况下是相似的。
  • 你改变了什么?我没有看到任何变化
  • chech printf("input: %d,%d,%d\n",numbers-&gt;x, numbers-&gt;y, numbers-&gt;z); 行,&amp; 被删除
  • 是的,也不要强制转换你的 malloc,编译器会确定这一点。
  • @Montaldo 在我看来,您应该将 main 定义为 int main(void) 我知道在 main 的情况下它并没有太大的区别,但是为了养成良好的习惯,将 void 添加到 no参数函数。请另外检查以下问题 [stackoverflow.com/questions/12225171/…
【解决方案2】:

您错误答案的原因是因为您将数据类型保留为 int,最大值为 32767,将其更改为 unsigned long int,因为您的 ans 计算为 2400612

【讨论】:

  • 在打印最终变量的值时尝试使用 %ld
  • 在我的 64 位系统上,无符号整数的最大值为 4294967295,但有符号短整数的最大值为 32767...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 2021-05-08
相关资源
最近更新 更多