c - 我们的练习代码输出了一个意外的 -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
解决方案
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
推荐阅读
- azure - 新 Kubernetes 集群自动扩展节点的预拉映像
- python - matplotlib.FuncAnimation 中的 func 问题未更新数据
- asp.net-core - ASP.Net Core 3.1 Identity 的主键/ID 的 Guid 而不是字符串
- java - 如何将“AES”密钥从 byth[] 转换为 UTF-8 字符串
- python - 重新采样数据框会产生意想不到的结果
- reactjs - TypeScript React Axios GET Request Returning Empty String Instead Of JSON
- amazon-cloudformation - 参数存储中所有 Windows 服务器名称的列表
- windows - docker 无法使用 https 导航到网站
- flutter - 操作系统错误:对等方重置连接,errno = 104,地址 = storage.googleapis.com,prort = 37890
- laravel - Heroku 上的 Laravel 6.2 应用程序;路线不工作