c - 乘以无符号字符时溢出?

标签 c casting char overflow int

当我像这样在 C 中将两个无符号字符相乘时:

unsigned char a = 200;
unsigned char b = 200;
unsigned char c = a * b;

然后我知道我会发生溢出,结果我得到 (40'000 modulo 256)。当我这样做时:

unsigned char a = 200;
unsigned char b = 200;
unsigned int c = (int)a * (int)b;

我会得到正确的结果 40'000。但是,我不知道这会发生什么:

unsigned char a = 200;
unsigned char b = 200;
unsigned int c = a * b;

我能确定正确的事情发生了吗?这个编译器依赖吗?同样,我不知道做减法时会发生什么:

unsigned char a = 1;
unsigned char b = 2;
int c = a - b;

将“c”设为无符号字符时,结果可能是 255。当我像这样使用 int 时会发生什么?

最佳答案

算术运算符的参数得到“通常的算术提升”。

在 int 可以表示所有操作数的所有值的情况下(在大多数实现中,您的示例就是这种情况),参数首先转换为 int。所以在这两种情况下,您都会得到正确的结果。

关于c - 乘以无符号字符时溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6266582/

相关文章:

c++ - 动态转换为 vector 迭代器

C 从函数返回 char 数组

c - 无法从内核模块中的 net_device 获取 mac 地址

c - 为给定测试用例查找阶乘的程序

c - 显示 ASCII 字符

c - 如何在C中将字符与char指针分开

c - char* 和 char[] 与 strcpy() 的区别

c - 如何使用 Pro*C 连接到数据库?

sql - Laravel 在数据库查询中将字符串转换为数字?

vb.net - 哪个更有效 Cstr(value) 或 value.ToString()