C语言中字符和整数相乘

C语言中字符和整数相乘,c,size,math,operands,varying,C,Size,Math,Operands,Varying,今天我发现了以下几点: #include <stdio.h> int main(){ char x = 255; int z = ((int)x)*2; printf("%d\n", z); //prints -2 return 0; } #包括 int main(){ 字符x=255; int z=((int)x)*2; printf(“%d\n”,z);//prints-2 返回0; } 所以基本上我得到了一个溢出,因为大小限制是由=符号右边的操作数决定的 为什么不在

今天我发现了以下几点:

#include <stdio.h>

int main(){
char x = 255;
int z = ((int)x)*2;

printf("%d\n", z); //prints -2

return 0;

}
#包括
int main(){
字符x=255;
int z=((int)x)*2;
printf(“%d\n”,z);//prints-2
返回0;
}
所以基本上我得到了一个溢出,因为大小限制是由=符号右边的操作数决定的

为什么不在乘以功之前将其强制转换为int


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

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

通过添加
unsigned
前缀,可以强制
char
unsigned

unsigned char x = 255;

似乎char已在您的平台上签名。因此
charx=255
实际上与
charx=-1
相同。转换为int并不重要

尝试将其更改为:

unsigned char x = 255;

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

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

因此,当您将255赋给
char
变量时,就会出现问题-这将导致实现定义的值,在您的示例中,该值看起来是-1


当你把-1乘以2,你得到-2。这里没有什么神秘之处。转换为
(int)
没有任何作用-比
int
更窄的类型总是在完成任何计算之前升级为
int
unsigned int

其他答案很好地解释了您的示例是如何“工作的”,因此我不再解释

然而,让我来观察一下,如果你想使用的是一个“无符号8位整数”,只需使用
uint8
(以及它的16、32、64位同伴),并且远离这个世界上所有的
字符
s、
s和
int
s。