gpt4 book ai didi

c++ - 通过引用传递参数时的C++类型转换

转载 作者:行者123 更新时间:2023-12-02 10:14:19 26 4
gpt4 key购买 nike

我有一个函数foo,带有通过引用传递的int参数。我有一个uint16_t类型的变量。我使用reinterpret_cast,这是代码:

#include <iostream>
#include <stdint.h>


void foo(int &bar) {
std::cout << "bar = " << bar << std::endl;
bar += 10;
}

int main() {
uint16_t baz = 100;
uint16_t qux = 200;
foo(reinterpret_cast<int &>(baz));
std::cout << "baz = " << baz << ", qux = " << qux << std::endl;
foo(reinterpret_cast<int &>(qux));
std::cout << "baz = " << baz << ", qux = " << qux << std::endl;
return 0;
}
输出为:
bar = 100
baz = 110, qux = 200
bar = 7209160
baz = 110, qux = 210
我的问题是:
  • 为什么在第二次调用foo()时,打印了错误的数字,但变量qux最终是正确的?
  • 调用参数通过引用传递的函数时,进行类型转换的正确方法是什么?
  • 最佳答案

  • 在函数foo中,std::coutuint16_t参数视为int,因此它读取了两个额外的字节。十进制200,十六进制qux的值为0x00C8。大长十进制数7209160为十六进制的0x006E00C8。您在该十六进制字符串中看到qux值了吗?十六进制字符串的开头部分是0x006E(十进制为110),这意味着std::cout在到达baz变量(大小仅为uint16_t)时也可能会将qux变量从堆栈中抢了下来。它正在寻找一个两倍大的整数。该变量最终是正确的,因为第二次将其传递给cout,将其正确地视为uint16_t值。
  • 在这种情况下,进行类型转换的正确方法是使用static_cast,因为此强制转换将告诉您是否可以在两种类型之间进行有效转换。在这种情况下,编译将失败。这与reinterpret_cast相反,后者仅指示编译器将位序列视为另一种类型,而无需考虑类型转换。
  • 关于c++ - 通过引用传递参数时的C++类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62500301/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com