Mar*_*cny 6 c math size varying operands
今天我发现了以下内容:
#include <stdio.h>
int main(){
char x = 255;
int z = ((int)x)*2;
printf("%d\n", z); //prints -2
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以基本上我得到溢出因为大小限制是由=符号右侧的操作数决定的?
为什么在乘法工作之前不将它转换为int?
在这种情况下,我使用char和int,但如果我使用"long"和"long long int"(c99),那么我会得到类似的行为.一般建议不要对不同大小的操作数进行算术运算吗?
caf*_*caf 11
char 可以是有符号或无符号,具体取决于您的编译器.
在您的情况下,它似乎是签名的,并且255超出了它可以表示的范围(可能,它只能表示-128到127之间的数字).
因此,当您为char变量赋值255时会出现问题- 这会导致实现定义的值,在您的情况下,似乎为-1.
当你将-1乘以2时,得到-2.那里没有神秘感.演员(int)不做任何事情 - 类型比在任何计算完成之前或之前int总是提升的类型更窄.intunsigned int
看来char已在您的平台上签名.所以char x = 255它实际上是一样的char x = -1.强制转换为int无关紧要.
尝试将其更改为:
unsigned char x = 255;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7715 次 |
| 最近记录: |