代码之家  ›  专栏  ›  技术社区  ›  duckkkk

C中的类型转换(降级)[关闭]

  •  -5
  • duckkkk  · 技术社区  · 7 年前

    有人能解释一下吗:

    如果目标是某种形式的无符号整数,并且分配的值是整数,则会忽略使值过大的额外位。

    我不明白“目的地类型”和赋值的含义。

    以上是第174页C Primer Plus(6ed代表me)Ch5类型转换部分的一段

    3 回复  |  直到 3 年前
        1
  •  1
  •   dbush    7 年前

    “目的地”是指分配给变量的值,即分配的左侧,而“分配值”是指分配给变量的值,即分配的右侧。

    例如:

    unsigned int destination = assigned_value;
    

    关于指定值超出目的地范围时发生的情况,请参见 C standard 关于有符号和无符号整数的转换,说明如下:

    1. 当整数类型的值转换为除\u Bool以外的其他整数类型时,如果该值可以用新的 类型,则保持不变。

    2. 否则 如果新类型是无符号的,则会通过重复加减一个大于最大值的值来转换该值 可以在新类型中表示,直到值位于 新类型的范围。

    这实际上意味着将该值转换为目标可以容纳的最大值加1的模。换言之,多余的位被剥离。

        2
  •  0
  •   Umaiki    7 年前

    例如:

    int          assign = -2;
    unsigned int dest   = 2;
    
    dest = assign ;
    

    在说明书中 dest = assign ,则, dest 是类型的目标 unsigned int assign 类型的赋值 int

    要小心,因为 dest = 4294967294 = 0xFFFFFFFE 在程序末尾的32位体系结构上。

        3
  •  0
  •   4386427    7 年前

    我认为这句话应该这样读:

     unsigned int destination = 258;
     \----------/               \-/
    destination type          assigned value
    

    在二进制中,258是

    1.0000.0010 (requires 9 bits)
    

    但无符号字符(通常)只能保存8位,因此只使用最右边的8位,而忽略其余的“额外”位。因此,无符号字符的二进制模式变为:

    0000.0010
    

    这是十进制值2。