【问题标题】: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 位整数”,只需使用 <stdint.h> 的 uint8_t(以及它的 16、32、64 位同伴)并远离所有这个世界上的chars、shorts 和ints。