用C乘以char和INT在一起
题
今天,我发现如下:
#include <stdio.h>
int main(){
char x = 255;
int z = ((int)x)*2;
printf("%d\n", z); //prints -2
return 0;
}
因此,基本上我发现了一个溢流由于尺寸限制由操作数=符号??
的右侧确定为什么没有铸造它乘以工作之前为int?
在这种情况下,我使用的是焦炭和INT,但如果我用“长”和“长长整型”(C99),然后我得到类似的行为。它是针对一般大小不同的操作数做算术建议?
解决方案
char
既可以符号或无符号,这取决于你的编译器。
在您的情况下,似乎要签名,和255是它可以代表(有可能的,它只能表示数字从-128至127)的范围内。
外因此,当分配255到您char
变量出现问题 - 在一个实现定义的值,其在你的情况下,似乎是-1这个结果
在乘-1 2,将得到-2。没有什么神秘的存在。演员到(int)
什么都不做 - 类型比int
窄总是晋升为int
或unsigned int
任何计算与他们之前完成
其他提示
看来,焦炭您的平台上签字。所以char x = 255
实际上是相同的char x = -1
。铸到INT并不重要。
尝试改变,为:
unsigned char x = 255;
没有,你没有得到在第二行上(乘)溢出。问题是你的编译器是使用signed char
默认和255溢出,将意味着-1。基本上,要初始化变量x
与值-1。铸造-1至INT将导致-1(signed
操作数将得到符号扩展在upcasts而unsigned
操作数将得到零扩展)。
可以通过将前缀char
迫使unsigned
是unsigned
:
unsigned char x = 255;
其他答案很好地解释如何你的榜样“作品”,所以我不会再解释一遍。
不过,让我注意观察,如果你想使用什么是“无符号的8位整数”,只是利用<stdint.h>
的uint8_t
已经(和它的16,32,64位同伴),并从所有char
s,short
s和int
s保持距离在这个世界上。
不隶属于 StackOverflow