Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/158.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如果我除以1,隐式类型转换不会发生吗?_C++_C - Fatal编程技术网

C++ 如果我除以1,隐式类型转换不会发生吗?

C++ 如果我除以1,隐式类型转换不会发生吗?,c++,c,C++,C,但如果计数=5,则输出: div -20 div1 -20 在count=5的情况下,有符号整数已隐式转换为无符号整数,为什么不将count=1转换为无符号整数呢。你可以在那里找到规则 实际上,第一个结果是(无符号)-4。使用补码规则,它将是858993455 您也可以参考这是最新版本。你可以在那里找到规则 实际上,第一个结果是(无符号)-4。使用补码规则,它将是858993455 你也可以参考 如果一个操作数为int,另一个操作数为unsigned int,则int操作数将转换为unsign

但如果计数=5,则输出:

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);