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

标签 c casting implicit-conversion

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

#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);

}

最佳答案

对于任何分配 a = b;b 的值被转换为 a 类型的值,前提是可能,并且转换后的值被分配给 a 。所以你提议的最外面的 Actor 是多余的。

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

foo x;

bar * y = (void *)&x;

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

显式转换的另一个用途是当它改变一个值的含义时——一个典型的例子是当你想要将一个 I/O 字节视为一个无符号值时。由于 char 可以是有符号的或无符号的,将 char 直接转换为 unsigned int 可能会给出错误的答案。例如,我们希望 -1 是值 255,而不是 -1。所以你需要:
char b = get_input();

unsigned int value = (unsigned char)b;

charunsigned char 的转换总是产生“预期的”无符号字节值,然后可以将其转换为无符号整数。

关于c - C中赋值期间的隐式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19623334/

相关文章:

java - 如何从十六进制转换为十进制以及从十进制转换为二进制

ruby - 如何使用字符串而不是符号来表示 `Symbol#to_proc` 速记

java - 不同编程语言的字符编码是否相同?

C - 内存设置与免费

c - C shell 管系统

java - 为什么可以将 JFrame 强制转换为 JPanel?

c - dup2 函数和程序行为

ASP.Net 错误 - 无法将类型 'System.String' 的对象转换为类型 'System.Data.DataTable'

c++ - 使用 cvflann::anyimpl::bad_any_cast 在 iOS 上拼接全景图会崩溃

java - scala 2.8 隐式 java 集合转换