我应该在括号之间写些什么来定义要更改为变量的数据类型?

时间:2019-10-08 22:14:09

标签: c

如果我有一个变量float var1 = 157.1;,并且想将其转换为int,我会做int var2 = (int)var1;

我想了解其他类型的数据,例如long intshort intunsigned short intlong double等。

我尝试了long int var2 = (long int)var1;,它似乎可以工作,但是我不确定它在语法上是否正确。如果是这样,我认为其他所有类型都是相同的,即数据类型及其属性之间用空格分隔。如果不是,我想知道是否有某种清单。

1 个答案:

答案 0 :(得分:2)

这是C强制转换运算符,但更一般的操作是“类型转换”,“强制转换”或“重新强制转换”。这是向编译器发出的请求特定转换的指令。

在转换时可以指定任何有效的C类型,因此:

int x = 10;
unsigned long long y = (unsigned long long) x;

在许多情况下,此转换可以隐式自动完成,因此并不总是必需的,但在其他情况下,您必须强制执行此转换。例如:

int x = 10;
float y = x; // Valid, int -> float happens automatically.

不过,您可能会感到惊讶:

int x = 10;
float y = x / 3; // y = 3.0, not 3.333, since it does integer division before casting

需要投射以获得正确结果的位置:

int x = 10;
float y = (float) x / 3; // 3.33333...

请注意,使用指针时,这是完全不同的游戏:

int x = 10;
int* px = &x;
float* y = (float*) px; // Invalid conversion, treats int as a float

通常,C相信您会知道自己在做什么,因此您可以轻松地将自己拍到脚上。从定义上说,“编译”在语法上是有效的,但是在不崩溃的情况下正确执行也是另外一个问题。 C“规则手册”(C标准)中未指定的任何内容都称为undefined behaviour,因此您需要了解违反规则的时间,例如最后一个示例。

有时候违反规则是必要的,例如Fast Inverse Square Root依赖于C任意重铸值的能力。