代码之家  ›  专栏  ›  技术社区  ›  Martin Konecny

用C将char和int相乘

  •  6
  • Martin Konecny  · 技术社区  · 15 年前

    今天我发现了:

    #include <stdio.h>
    
    int main(){
    char x = 255;
    int z = ((int)x)*2;
    
    printf("%d\n", z); //prints -2
    
    return 0;
    
    }
    

    所以基本上我得到了一个溢出,因为大小限制是由=符号右边的操作数决定的??

    为什么不在乘法运算前将其强制转换为int?

    在本例中,我使用的是char和int,但是如果我使用“long”和“long long int”(c99),那么我会得到类似的行为。一般建议不要对不同大小的操作数进行算术运算吗?

    4 回复  |  直到 15 年前
        1
  •  11
  •   caf    15 年前

    char 可以是有符号的,也可以是无符号的,这取决于编译器。

    在您的情况下,它似乎是有符号的,255超出了它可以表示的范围(很可能,它只能表示-128到127之间的数字)。

    因此,当您将255分配给 烧焦 变量-这将产生一个实现定义的值,在您的情况下,该值似乎是-1。

    当你把-1乘以2,你得到-2。那里没有神秘。演员阵容 (int) 什么都不做-类型比窄 int 总是提升到 int unsigned int 在进行任何计算之前。

        2
  •  5
  •   R Samuel Klatchko    15 年前

    似乎char已在您的平台上签名。所以 char x = 255 实际上与 char x = -1 . 演员阵容对国际并不重要。

    尝试将其更改为:

    unsigned char x = 255;
    
        3
  •  4
  •   Mehrdad Afshari    15 年前

    不,在第二行(乘法)上没有溢出。问题是编译器正在使用 signed char 默认情况下,255个溢出,表示-1。基本上,您正在初始化变量 x 值为-1。将-1强制转换为int将导致-1( signed 操作数将在upcast中得到符号扩展,而 unsigned 操作数将得到零扩展)。

    你可以强迫 char 成为 未签名的 通过添加 未签名的 前缀:

    unsigned char x = 255;
    
        4
  •  3
  •   ndim    15 年前

    其他答案很好地解释了您的示例是如何“工作”的,所以我不再解释这个问题。

    但是,让我观察一下,如果您要使用的是“无符号8位整数”,只需使用 <stdint.h> uint8_t 已经(和它的16位、32位、64位伙伴)并且远离所有 char S short S和 int 在这个世界上。