在C中赋值期间的隐式转换?

时间:2013-10-27 20:44:57

标签: c casting implicit-conversion

在这种情况下我们需要演员吗?:

#include <stdio.h>
#include <stdint.h>

int main(){

  // Say we're working with 32-bit variables.
  uint32_t a = 123456789;
  uint32_t b = 5123412;
  uint32_t c = 123049811;

  // We want to use 64-bit arithmetic at some intermediate stage, 
  // e.g. the a*b product here. After dividing by 'c', the result
  // again fits into a 32-bit unsigned, 'result'.
  uint32_t result = (uint64_t)a*b/c;

  // QUESTION HERE: Should we cast before the assignment? I.e.:
  //uint32_t result = (uint32_t)( (uint64_t)a*b/c );

  // Either way the result turns out OK on my system.
  printf("%u\n", (unsigned)result);

}

3 个答案:

答案 0 :(得分:2)

对于任何作业a = b;b的值会转换为a类型的值,前提是可能,并且转换后的值已分配给{{1} }}。所以你提出的最外层演员是多余的。

但并非所有此类转换都是可能的,并且可以使用强制转换来强制进行转换,或者创建一个不存在直接转换的合法转换链,如下一个示例所示:

a

没有从foo x; bar * y = (void *)&x; foo *的隐式转换,但 是从任何对象指针类型到bar *的隐式转换(尽管它未指定void *是否具有可用或有用的值。

显式强制转换的另一个用途是它改变了值的含义 - 典型的例子是当你想将I / O的一个字节视为无符号值时。由于y可以是已签名或未签名,因此将char直接转换为char可能会给出错误的答案。例如,我们希望unsigned int为值255,而不是-1。所以你需要:

-1

char b = get_input(); unsigned int value = (unsigned char)b; char的转换始终会产生“预期的”无符号字节值,然后可以将其转换为无符号整数。

答案 1 :(得分:1)

// QUESTION HERE: Should we cast before the assignment? I.e.:
//uint32_t result = (uint32_t)( (uint64_t)a*b/c );

这里不需要演员。

当将一个算术类型的值赋给不同算术类型的对象时,C永远不需要强制转换。所有算术类型之间都存在隐式转换。

现在请注意,某些编译器可能会发出警告。例如,如果右操作数是常量表达式并且在左操作数的类型中无法表示,则gcc会发出警告。

答案 2 :(得分:0)

6.3转换次数:

  

多个运算符自动将操作数值从一种类型转换为另一种类型。这个   sub-clause指定这种隐式转换所需的结果,以及那些   由演员操作(显式转换)产生的结果。

6.5.16.1简单分配:

  

在简单赋值(=)中,右操作数的值被转换为类型   赋值表达式并替换存储在左侧指定的对象中的值   操作数。