今天,我发现如下:

#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窄总是晋升为intunsigned 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迫使unsignedunsigned

unsigned char x = 255;

其他答案很好地解释如何你的榜样“作品”,所以我不会再解释一遍。

不过,让我注意观察,如果你想使用什么是“无符号的8位整数”,只是利用<stdint.h>uint8_t已经(和它的16,32,64位同伴),并从所有chars,shorts和ints保持距离在这个世界上。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top