【问题标题】:Why does this output 234 in CPP为什么这个在 CPP 中输出 234
【发布时间】:2022-08-22 04:08:00
【问题描述】:
#include <iostream>

using namespace std;

template <typename T, typename E, typename R>
R multiply(T x, E y, R r) {
    return static_cast<typeof(r)>(x * y);
}

int main() {
    double x = multiply(6, 80, uint8_t());
    cout << x << endl;
    return 0;
}

嘿,下面的代码输出是 224,但如果 6*80 = 480,这怎么可能。后续问题是“我怎样才能写得更好”?

  • uint8_t 的取值范围为 0…255。您不能使用uint8_t 表示超出该范围的任何内容。
  • 注:assert((480 % 256) == 224)
  • 你能解释一下为什么吗?不仅像 224 的公式
  • 您是在问为什么不能将值 480 存储在 8 位整数中?您是在问为什么 480 的最低 8 位产生值 234?
  • 你的意思是为什么8位只能代表0..255?

标签: c++


【解决方案1】:

比如为什么结果是 224

值 480 以二进制表示:

1 1110 0000

那是9位。 1 代表 256 + 128 + 64 + 32。

如果将此值存储在八位变量,它只能保存最低 8 位:

1110 0000

这个二进制数的值是 128 + 64 + 32。换句话说,224。

它正好比原始值小 256,因为 uint8_t 没有一点来表示 256。

存储在uint8_t 中的任何非负值x 都将具有值x % 256

我怎样才能写得更好?

将结果存储在可以表示 480 的变量中。

例如,

double x = multiply(6, 80, uint16_t());

或者,为简单起见,因为您已经将结果转换为 double

double x = multiply(6, 80, double());

【讨论】:

    【解决方案2】:

    为什么这个输出 224 [原文如此]

    因为你要求结果是一个字节,而 480 比一个字节大,所以它会翻转。

    我怎样才能写得更好?

    几乎任何其他方式,真的。例如,您可以简单地乘以您的值,您不需要该函数。

    如果您坚持使用模板函数,请为操作数使用相同的类型。如果您将数字相乘,则拥有三种不同的类型将一无所获:

    template <typename T>
    T multiply(T x, T y, T r) {
        return x * y;
    }
    

    称为:

    auto res = multiply<uint8_t>(6, 80); // 224
    auto res = multiply(6, 80);          // 480
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-17
      • 2013-02-21
      • 2021-04-06
      • 2015-09-29
      • 2012-07-17
      • 2016-05-23
      • 1970-01-01
      • 2022-11-16
      相关资源
      最近更新 更多