c++ - 将值乘以 static_cast<uint8_t> 时如何确定 auto 的类型

标签 c++

<分区>

对于这段代码:

int main(int argc, char **argv)
{
    auto a =     static_cast<uint8_t>(sizeof(uint64_t));
    auto b = 8 * static_cast<uint8_t>(sizeof(uint64_t));

    auto c =     static_cast<uint32_t>(sizeof(uint64_t));
    auto d = 8 * static_cast<uint32_t>(sizeof(uint64_t));

    return EXIT_SUCCESS;
}
  • a 的类型解析为unsigned char,
  • b的类型解析为int,
  • c 的类型解析为 unsigned int 并且,
  • d 的类型解析为 unsigned int

我期望 acd 的这些结果,但我对 b 感到困惑.

64 显然适合 8 位 unsigned char。谁能解释一下?

casting to auto

最佳答案

您不是在“转换为自动”(这将毫无意义/不可能); auto 一如既往地触发编译器采用 RHS 上的表达式类型。该类型不受运行时值和您拥有的位数的约束,而受标准约束。标准的整数提升规则意味着乘法的结果是 int 类型,而不是 char。但是,当表达式已经int 类型时,不需要整数提升,因此d 保持无符号性它的右手操作数。

关于c++ - 将值乘以 static_cast<uint8_t> 时如何确定 auto 的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49566572/

相关文章:

c++ - 在 main 启动之前访问命令行

c++ - Lambda 隐式捕获因结构化绑定(bind)声明的变量而失败

c++ - 将文件流插入到 std::map

c++ - 如何分配一个 std::pair 其中一个组件类型为 const?

c++ - ntdll.dll [下面的框架可能不正确/缺失,没有为 ntdll.dll 加载符号]

c++ - 除以一应该得到一个特例吗?

python - 为什么在 C++ 上使用 OpenCV 时的 CPU 使用率比在 Python 上高

c++ - 访问多维 std::array 元素时出现问题

C++,静态与命名空间与单例

c++ - 如何在 C++ 中简洁地初始化安全集合?