gpt4 book ai didi

c - "long i = 1;"会导致 C 中的隐式类型转换吗?

转载 作者:行者123 更新时间:2023-12-04 12:20:17 25 4
gpt4 key购买 nike

如果我写“long i = 1;”而不是“long i = 1l;”,1 会被识别为int 然后隐式转换为 long

编辑:谢谢大家。我看到没有类型转换。后缀 u(如 10u)也是这种情况吗?那lu有什么用呢?

最佳答案

常量 1 的类型是 int,因此从技术上讲会进行类型转换,但会在编译时完成,不会丢失任何内容。

但是,请考虑以下更有趣的示例:

int main(void)
{
long long i = -2147483648;
long long j = -2147483647 - 1;

printf( " i is %lld, j is %lld\n", i, j);

return(0);
}

我从各种编译器得到以下结果:

  • MSCV 9(版本 15.00.21022.08):

                i is 2147483648, j is -2147483648
  • 海湾合作委员会 (3.4.5):

                i is -2147483648, j is 0
  • 科莫 (4.3.10.1):

                i is 2147483648, j is -2147483648
  • 数字火星:

                i is -2147483648, j is -2147483648

我还不确定如何解释这些差异。它可以是以下一项或多项:

  • 编译器错误
  • 操作数提升中的 C90 与 C99 规则(“long long”支持是 C99,但其中一些编译器可能会使用“long long”为 C90 编译,因为一个扩展)
  • 实现定义的行为
  • 未定义的行为

FWIW,MSVC 和 Comeau 的行为符合我的预期 - 许多人可能仍然感到惊讶。第一个操作的逻辑(在我看来)是:

  • -2147483648 被标记为“-”和 2147483648
  • 2147483648 是一个无符号整数(因为它不能放入一个 int - 我相信这在 C99 中是不同的)
  • 由于无符号算术规则,再次应用一元“-”运算符会导致 2147483648
  • 将其转换为 long long 并不会改变符号。

第二个操作的逻辑是:

  • -2147483647 被标记为“-”和 2147483647
  • 2147483647 是一个有符号整数
  • 减去 1 结果是 -2147483648 因为表示该数字没有问题
  • 将其转换为 long long 并不会改变符号。

关于c - "long i = 1;"会导致 C 中的隐式类型转换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1485271/

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