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

为什么在为`int`赋值时,`char`不会释放数据?

  •  0
  • Greeshma  · 技术社区  · 1 年前

    我是一名C程序员新手。我定义了两个变量 int x = 0xffffffff char y = x 之后,我使用 printf("%x\n", y) 功能;我原本预计会发生这样的事情 ff 在终端上,而是打印出来的 ffffffff 在屏幕上。我想知道怎么才能 char 当char的存储大小为1时,存储4个字节的存储空间。

    #include <stdio.h>
    
    int main(void) {
        int x = 0xffffffff;
        char y = x;
        printf("%x\n", y);
    
        return 0;
    }
    
    2 回复  |  直到 1 年前
        1
  •  5
  •   dbush    1 年前

    实际上,这里发生了相当多的事情。第一:

    int x = 0xffffffff;
    

    整数常数 0xffffffff 值为4294967295(即2 32 -1) 以及一种 unsigned int ,假设 int 是32位。

    这个 无符号整型 然后将值转换为 int 用于初始化。这会经历一个实现定义的转换,在大多数情况下,这会导致分配值-1。该值恰好与二进制补码中的原始值具有相同的表示形式。

    然后在这条线上:

    char y = x;
    

    我们正在初始化 y 值为-1。该值在a的范围内 char (假设 烧焦 已签名),因此从转换时值没有变化 int 烧焦 在这种情况下。假设2的补码表示,则表示为 0xff .

    然后打印时:

    printf("%x\n", y);
    

    因为 printf 是一个变量函数,参数 y 哪个有类型 烧焦 促进 键入 int 在传递给函数之前。如前所述,这两种类型都可以存储值-1,因此值不变。

    这个 %x 格式说明符需要一个类型为的参数 无符号整型 .自从 int 通过而不是 无符号整型 这在技术上是未定义的行为,但有符号/无符号不匹配不太可能在任何实际实现中造成问题。

    既然如此 int 值-1表示 0xffffff 当被解释为 无符号整型 会有这个价值,所以 ffffffff 这就是印刷品。

    所以回答你的问题:

    当char的存储大小为1时,char如何存储4个字节的存储。

    事实并非如此。它只是因为相关类型的转换和表示而看起来如此。

        2
  •  1
  •   Allan Wind    1 年前

    如果满足以下条件,则定义了实施 char signed unsigned :

    • 如果 烧焦 签署 然后 char y = x 指定值 -1 x 当升级为32位时(大小实现已定义) int printf() 将二进制补码中的值编码为 0xFFFFFFFF (截至C 2023;之前的C标准对负值的编码进行了实现定义)。

    • 如果 烧焦 未签名 然后它将打印 0xFF .

    格式说明符 %x 期待A unsigned int 因此,在打印到定义良好的行为之前,您确实应该将其转换为这样。