如果我除以 1,隐式类型转换不会发生
Will implicit type conversion not happen if I divide by 1?
#include <stdio.h>
int main()
{
unsigned int count=1;
signed int val = -20;
signed int div=(val/count);
signed int div1=(val/(signed int)count);
printf("div %d div1 %d n",div,div1);
return 0;
}
输出:
div -20 div1 -20
但是如果计数 = 5,则输出:
div 858993455 div1 -4
在 count=5 中,有符号的 int 已被隐式转换为无符号的 int,为什么不为 count=1
signed int div=(val/count);
如果其中一个操作数int
而另一个操作数unsigned int
,则int
操作数转换为unsigned int
。所以这里val
被转换成unsigned int
,然后除以count
,然后结果被转换回int
。
也就是说,此表达式的计算结果为
int div = (int)((unsigned int)val / count);
所以当count == 1
时,结果保持不变,但是当count == 5
时,(unsigned int)val / count
的结果变得小于INT_MAX
,所以当转换回int
时,它不会改变它的(大正(值。
请注意,严格来说,即使count == 1
结果也不必-20
,因为从(unsigned int)-20
到int
的转换结果是实现定义的。
没有"隐式类型转换"这样的东西,类型转换是指显式更改操作数的类型。正确的术语是隐式(类型(转换。
C 的基本原则指出,编译器可以随意订购或优化程序,只要它不改变程序的结果。
因此,即使编译器发现除以 1 没有意义并且可以优化掉,它仍然必须考虑隐式类型转换导致的潜在副作用:它无法优化这些副作用,因为程序员可能有意依赖它们。
在您的特定情况下,signed int div=(val/count)
将强制val
隐式转换为无符号类型。但这并不重要,因为您将结果显示回有符号类型,并且除以 1 的任何内容无论如何都会保持不变。因此,编译器可以优化整个事情,因为无论使用无符号还是有符号算术,结果都是相同的。
但是,如果除以 5,则结果在 -20/5 = -4
和 0xFFFFFFEC/5 = 0xFFFFFFFC
之间会变得非常不同。因此,不允许编译器优化隐式转换,因为它会影响结果。
因此,程序员必须知道隐式类型转换规则,以告知他们自己的源代码行之间实际会发生什么。
这是通常的算术转换。 你可以在那里找到规则。
所以实际上,第一个结果是(无符号(-4。 使用补码规则,它将858993455。
您还可以引用隐式转换
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++中的双指针类型转换
- 逐位操作的隐式类型转换
- 模板中的类型转换
- 在 C++(和 C)中进行类型转换时明显不一致
- 字符类型转换不兼容
- 将复杂的非基元C++数据类型转换为 Erlang/Elixir 格式,以使用 NIF 导出方法
- C++:用户定义的显式类型转换函数错误
- 将类指针类型转换为键时出错
- 通过引用传递参数时C++类型转换
- 在 C++ 中将一个模板类型的对象类型转换为另一个模板类型
- C++显式类型转换(C 样式强制转换)的强制表示法和static_cast的多种解释
- C++无效的函数类型转换
- 在将派生类指针类型转换为派生类指针后,从基类指针调用派生类函数
- 如何将模板类型转换为字符串(如果它也可以是字符串)
- 如果我除以 1,隐式类型转换不会发生
- 如果我不做const_cast<char*>而简单地使用(char *)类型转换有什么害处吗?
- 为什么将CString类型转换为wchar_t*会产生一个临时副本?如果我们使用其他类型而不是CString呢?
- 如果将数字分配给不带后缀的长类型,是否会发生类型转换"L"