gpt4 book ai didi

c++ - 数据类型之间的隐式转换

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:15:05 24 4
gpt4 key购买 nike

例如,为什么 unsigned shortint 之间的运算结果总是产生 int

unsigned short s = 65535;
int i = 65535

表达式 typeid(s * i * i).name(),给出了一个超出 int 范围的值,但隐式转换仍然返回一个int,为什么?

最佳答案

有一组转换称为 usual arithmetic conversions在大多数算术运算符的评估之前使用。

基本上,您可以认为有一些整数运算规则:

  • 首先,从不使用“小于”int 的操作数执行整数运算,因此在 short * signed char 的情况下, shortsigned char 操作数被提升为 int,两个 int 值相乘,然后结果是一个 int.

  • 其次,如果一个或两个类型都“大于”int,编译器会选择一个至少与最大操作数的类型“一样大”的类型。因此,如果您有 long * int,则 int 会被提升为 long,结果为 long .

  • 第三,如果任一操作数是无符号,则结果是无符号的。所以,如果你有 long * unsigned intlongunsigned int 都会被提升为 unsigned long 结果是一个 unsigned long

如果任一操作数具有浮点类型,则执行浮点运算:使用floatdoublelong double(这一个取决于操作数的类型;可以在本答案开头链接的页面上找到用于确定结果类型的完整表格)。

请注意,结果类型不依赖于操作数的值。在知道值之前,编译器必须在编译时选择类型。

如果 s * i * i 的结果超出结果类型的范围(int,在您的场景中),那么您就不走运了:你的程序无法在运行时决定,“哦,我应该切换到使用 long!”因为必须在编译时选择结果类型。

关于c++ - 数据类型之间的隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5318424/

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