【问题标题】:Multiplying char and int together in C在C中将char和int相乘
【发布时间】:2010-04-16 00:06:51
【问题描述】:

今天我发现了以下内容:

#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),那么我会得到类似的行为。通常是否建议不要使用不同大小的操作数进行算术运算?

【问题讨论】:

    标签: c size math operands varying


    【解决方案1】:

    char 可以是有符号或无符号的,具体取决于您的编译器。

    在您的情况下,它似乎已签名,并且 255 超出了它可以表示的范围(可能只能表示从 -128 到 127 的数字)。

    因此,当您将 255 分配给您的 char 变量时,就会出现问题 - 这会导致实现定义的值,在您的情况下,该值似乎是 -1。

    当你将 -1 乘以 2 时,你得到 -2。那里没有奥秘。转换为 (int) 没有任何作用 - 比 int 窄的类型总是在对其进行任何计算之前提升为 int 或 unsigned int。

    【讨论】:

      【解决方案2】:

      似乎 char 已在您的平台上签名。所以char x = 255 实际上与char x = -1 相同。转换为 int 无关紧要。

      尝试将其更改为:

      unsigned char x = 255;
      

      【讨论】:

        【解决方案3】:

        不,第二行(乘法)没有溢出。问题是您的编译器默认使用signed char 并且255 溢出并且意味着-1。基本上,您使用 -1 的值初始化变量 x。将 -1 转换为 int 将导致 -1(signed 操作数将在向上转换中进行符号扩展,而 unsigned 操作数将进行零扩展)。

        您可以通过添加 unsigned 前缀来强制 char 为 unsigned:

        unsigned char x = 255;
        

        【讨论】:

          【解决方案4】:

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

          但是,让我观察一下,如果您要使用的是“无符号 8 位整数”,只需使用 &lt;stdint.h&gt; 的 uint8_t(以及它的 16、32、64 位同伴)并远离所有这个世界上的chars、shorts 和ints。

          【讨论】:

          • #include 用于这些类型。
          猜你喜欢
          • 2015-04-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-21
          • 1970-01-01
          • 1970-01-01
          • 2011-06-29
          • 2015-03-25
          相关资源
          最近更新 更多