C++ 如果我除以1,隐式类型转换不会发生吗?
但如果计数=5,则输出:C++ 如果我除以1,隐式类型转换不会发生吗?,c++,c,C++,C,但如果计数=5,则输出: div -20 div1 -20 在count=5的情况下,有符号整数已隐式转换为无符号整数,为什么不将count=1转换为无符号整数呢。你可以在那里找到规则 实际上,第一个结果是(无符号)-4。使用补码规则,它将是858993455 您也可以参考这是最新版本。你可以在那里找到规则 实际上,第一个结果是(无符号)-4。使用补码规则,它将是858993455 你也可以参考 如果一个操作数为int,另一个操作数为unsigned int,则int操作数将转换为unsign
div -20 div1 -20
在count=5的情况下,有符号整数已隐式转换为无符号整数,为什么不将count=1转换为无符号整数呢。你可以在那里找到规则
实际上,第一个结果是(无符号)-4。使用补码规则,它将是858993455
您也可以参考这是最新版本。你可以在那里找到规则
实际上,第一个结果是(无符号)-4。使用补码规则,它将是858993455
你也可以参考
如果一个操作数为int
,另一个操作数为unsigned int
,则int
操作数将转换为unsigned int
。因此这里val
被转换为无符号整数
,然后除以计数
,然后结果被转换回整数
也就是说,此表达式的计算结果为
signed int div=(val/count);
因此,当count==1
时,结果保持不变,但当count==5
时,(无符号int)val/count
的结果小于int\u MAX
,因此当转换回int
时,它不会改变其(大的正)值
请注意,严格来说,即使count==1
结果也不一定是-20
,因为从(无符号int)-20
到int
的转换结果是由实现定义的
如果一个操作数为int
,另一个操作数为unsigned int
,则int
操作数将转换为unsigned int
。因此这里val
被转换为无符号整数
,然后除以计数
,然后结果被转换回整数
也就是说,此表达式的计算结果为
signed int div=(val/count);
因此,当count==1
时,结果保持不变,但当count==5
时,(无符号int)val/count
的结果小于int\u MAX
,因此当转换回int
时,它不会改变其(大的正)值
请注意,严格地说,即使count==1
结果也不一定是-20
,因为从(无符号int)-20
到int
的转换结果是实现定义的。没有“隐式类型转换”这样的事情,类型转换指显式更改操作数的类型。正确的术语是隐式(类型)转换
C语言的基本原理是,只要不改变程序的结果,编译器就可以随意排序或优化程序
因此,即使编译器发现除法1没有意义,并且可以进行优化,它仍然必须考虑隐式类型转换引起的潜在副作用:它无法优化这些副作用,因为程序员可能有意依赖它们
在您的特定情况下,signed int div=(val/count)
将强制val
隐式转换为无符号类型。但这并不重要,因为你将结果显示回一个有符号的类型,任何除以1的值都将保持不变。因此,编译器可以优化整个过程,因为无论使用无符号或有符号算术,结果都是一样的
但是如果除以5,则-20/5=-4
和0xFFFFFFEC/5=0xFFFFFFFC
之间的结果会非常不同。因此,不允许编译器优化隐式转换,因为它会影响结果
因此,程序员必须知道在他们自己的源代码行之间实际会发生什么。没有“隐式类型转换”这样的事情,类型转换是指显式更改操作数的类型。正确的术语是隐式(类型)转换
C语言的基本原理是,只要不改变程序的结果,编译器就可以随意排序或优化程序
因此,即使编译器发现除法1没有意义,并且可以进行优化,它仍然必须考虑隐式类型转换引起的潜在副作用:它无法优化这些副作用,因为程序员可能有意依赖它们
在您的特定情况下,signed int div=(val/count)
将强制val
隐式转换为无符号类型。但这并不重要,因为你将结果显示回一个有符号的类型,任何除以1的值都将保持不变。因此,编译器可以优化整个过程,因为无论使用无符号或有符号算术,结果都是一样的
但是如果除以5,则-20/5=-4
和0xFFFFFFEC/5=0xFFFFFFFC
之间的结果会非常不同。因此,不允许编译器优化隐式转换,因为它会影响结果
因此,程序员必须知道在他们自己的源代码行之间实际会发生什么。我没有看到这里定义的
avg
或avg1
。你的意思是div
和val1
而不是avg
和avg1
,或者反之亦然?请更正你的代码示例<代码>第1部分??在这里显示真实代码,伙计!我不确定哪个白痴会对这个问题提出质疑。C++的类型化是C和C++的共同话题。我认为两者都值得标记。我看不到这里定义了任何avg
或avg1
。您是指div
和val1
而不是avg
和avg1
吗?请更正您的代码示例<代码>第1部分??在这里显示真实代码,伙计!我不确定哪个白痴会对这个问题提出质疑。C++的类型化是C和C++的共同话题。我觉得两者都值得一试,你呢
signed int div=(val/count);
int div = (int)((unsigned int)val / count);