分享
三行代码  ›  专栏  ›  技术社区  ›  Duarte Arribas

我应该在括号之间写些什么来定义我希望变量更改为的数据类型? - What should I write in between parentheses to define the data type I want a variable to change to?

c
  •  2
  • Duarte Arribas  · 技术社区  · 1 周前

    如果我有一个变量 float var1 = 157.1; 我想把它转换成整数 int var2 = (int)var1;

    我想知道其他类型的数据,比如 long int 我是说, short int 我是说, unsigned short int ,请 long double 等等。

    我试过了 long int var2 = (long int)var1; 它看起来很有效,但我不确定它在语法上是否正确。如果是,我假设其他所有类型都是一样的,也就是说,只有数据类型及其属性被一个空格隔开。如果不是的话,我想知道是否有他们的名单。

    1 回复  |  直到 1 周前
        1
  •  2
  •   tadman    1 周前

    这是c cast操作符,但操作通常是“类型铸造”、“铸造”或“重铸”。这是编译器请求特定转换的指令。

    在强制转换时,可以指定任何有效的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任意重铸值的能力。