首页 > 解决方案 > 我们的练习代码输出了一个意外的 -1,我们不知道为什么

问题描述

所以我们正在为 Uni 做一个练习,我们无法弄清楚为什么这段代码将第二个值输出为 -1 我们认为这是由于 16 位限制,但不明白为什么并且找不到关于这个问题的任何来源,因为我们不知道它实际上是什么。如果这看起来真的很愚蠢,我很抱歉,请帮助 D:

#include <stdio.h>
#include <stdint.h>

int main() {
  int16_t y = 1024, z = 65; // auch "short" als Datentyp verwendbar

  y = y * z;
  printf("1. Ausgabe: %d\n", y);
  printf("2. Ausgabe: %d\n", y / 3 * 3 - 3 * y / 3);
  printf("\n");

  return 0;
}

我们预计 2 的结果为 0。Ausgabe 但它输出 -1

标签: c

解决方案


int16_t 的范围是 -32,768 ... 32,767

y * z = 1024*65 = 66560但因此将存储为66560 % 2^16 = 1024 所以你仍然有y = 1024并且你的语句y = y * z是无用的

y / 3 * 3 = (y / 3) * 3 = 341 * 3 = 1023 != y因为四舍五入

3 * y / 3 = (3 * y) / 3 = y因为没有四舍五入

当你减去你得到-1

问题是你溢出你的变量并进行整数除法

使用浮点数而不是 int16_t


推荐阅读