如果我有一个变量float var1 = 157.1;
,并且想将其转换为int,我会做int var2 = (int)var1;
我想了解其他类型的数据,例如long int
,short int
,unsigned short int
,long double
等。
我尝试了long int var2 = (long int)var1;
,它似乎可以工作,但是我不确定它在语法上是否正确。如果是这样,我认为其他所有类型都是相同的,即数据类型及其属性之间用空格分隔。如果不是,我想知道是否有某种清单。
答案 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任意重铸值的能力。