c - 根据标准,什么样的类型转换是显式冗余的?

标签 c

我对有关此事的规则感到困惑 [一个好的 URL 可能会节省回答时间]。我注意到很多时候转换是隐式工作的,但其他时候它是必需的。

例如我原以为它会起作用:

long long a;
int b;
[..]
a = b * 1000;

但事实证明,'a'溢出了,它需要

a = (long long) b * 1000;

这很奇怪,因为“a”是“大的”,我原以为它会很麻烦。

无论如何,除了那个例子,你知道关于这件事的全面信息来源吗?不,“大部分时间都还好”,这让我变得偏执。

编辑:这只是“第二部分首先进行计算然后溢出,请严格遵守该规则”的问题吗?

EDIT2:如果有这样的计算

long long a;
int b;
short c;
[..]
c = b + a * 3;

,会做

c = b + (int) a * 3; 

确保正确转换?

还是需要

c = (short) b + (int) a * 3; 

或者,是否足够

c = (short) b + a * 3; 

最佳答案

类型转换是一步一步进行的。你的表情可以看作是

a = (b * 1000);

b * 1000 中,编译器(假设它很愚蠢)不知道您要将它存储到 long long 中。由于 b 和 1000 都是 int,因此结果也将是 inta 有多大在这里无关紧要。

您可以通过将 1000 设为 long long 来避免转换。

a = b * 1000LL;

编辑:对于您的编辑 2:

  • a是一个long longb是一个int3是一个 int
  • 因此,a * 3是一个long long
  • 因此,b + a*3 是一个long long
  • 但在 c = b+a*3 中不需要转换,因为算术操作数可以隐式地相互转换。

关于c - 根据标准,什么样的类型转换是显式冗余的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3429698/

相关文章:

c - getenv 的标准 C 用法和安全实践

c - 如何在特定位置写入文件?

c - 尝试将字符串直接传递给函数时会导致段错误

c - 为什么数组有时会被越界调用

c - 在 C 中将 block 指令作为宏的参数传递

c - 两个 child 执行 ls -la | grep 使用管道

c - 这个 C 程序如何打印值 1 或 0?

使用iconv在C中将Unicode代码点转换为UTF-8

C++ 数组和指针

c++ - 为什么系统调用 socket(AF_INET, SOCK_RAW, IPPROTO_RAW) 返回 -1 的文件描述符?我认为这是一个错误