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

把char和int相乘在C的第2部分

  •  0
  • Martin Konecny  · 技术社区  · 14 年前

    int c0 = CHAR_MAX; //8 bit
    int c1 = CHAR_MAX; //8-bit
    int i = c0*c1; //store in 32-bit variable
    printf("%d\n", i); //prints 16129
    

    我们可以看到,将8位数字相乘并产生32位输出是没有问题的。

    int i0 = INT_MAX; //32-bit
    int i1 = INT_MAX; //32 bit variable
    long long int ll = i0*i1; //store in 64-bit variable
    printf("%lld\n", ll); //prints 1..overflow!!
    

    在这种情况下,两个32位变量相乘,溢出,然后分配给64位变量。

    那么为什么当整数相乘而不是字符相乘时会发生溢出呢?它是否取决于我的机器的默认字号(32位)

    3 回复  |  直到 14 年前
        1
  •  1
  •   unwind    14 年前

    至少在Linux系统上, CHAR_MAX 当然不是8位数字。这是一个(或多或少)简单的预处理器定义,如下所示:

    #  define SCHAR_MAX     127
    
    /* Maximum value an `unsigned char' can hold.  (Minimum is 0.)  */
    #  define UCHAR_MAX     255
    
    /* Minimum and maximum values a `char' can hold.  */
    #  ifdef __CHAR_UNSIGNED__
    #   define CHAR_MIN     0
    #   define CHAR_MAX     UCHAR_MAX
    #  else
    #   define CHAR_MIN     SCHAR_MIN
    #   define CHAR_MAX     SCHAR_MAX
    #  endif
    

    所以,对于一个有签名的系统 char s、 最后两行是有效的,这意味着当您在代码中编写CHAR\u MAX时,编译器将看到一个具有 int .

    这意味着乘法 字符最大值 * 发生在 内景 精确。

        2
  •  3
  •   Péter Török    14 年前

    int i0 = INT_MAX; //32-bit
    int i1 = INT_MAX; //32 bit variable
    long long ll = ((long long)i0)*i1; //compute and store in 64-bit variable
    printf("%lld\n", ll);
    

    也就是说,将int(至少一个)强制转换为64位 之前 int 在将其分配给 long long

    在第一个例子中,一个 内景 大到足以容纳乘法的结果 char

    作为旁注,命名变量 ll

        3
  •  0
  •   TheCodeArtist    14 年前

    Typecast的工作原理。。。


    除非指定了显式类型转换,否则任何表达式都将类型转换为所涉及的最高精度变量/常量的精度。

    正如Peter指出的,在表达式中使用显式类型转换可以提高精度。

    注: “长整型” 部分。也许是因为 长的 自从我看到一个…;-)

    • 双长整型 真的要声明64位整数吗??

    你用的是哪种编译器??