int a = 5 , b = 2 ;
double ans1 = a / b ; // ans1 = 2
cout << setprecision ( 4 ) << fixed << ans1 << endl ;
unsigned short int c = USHRT_MAX , d = USHRT_MAX ;
unsigned int ans2 = c + d ; // ans2 = 131070
cout << ans2 ;
Run Code Online (Sandbox Code Playgroud)
评估(a/b)时会发生什么?
1)结果首先存储在int(RHS上的变量类型)然后转换为64位double(LHS上的变量类型)然后存储在ans1或第一个变量中转换为64位double(变量类型on LHS)然后/发生?
2)如果首先在RHS上评估为变量类型,那么第二个如何打印正确的ans(因为ans超出了unsigned short int的限制)
在第一个示例中,首先int使用截断整数除法对两个s进行除法,然后将该结果赋予(2)ans1.
第二种情况是在一个微妙的方式不同:你选择了是整数类型小比int.因此,在任何算术运算符对它们进行操作之前,它们都会转换为int(如果它适合,就像在此处一样unsigned int),同时保留它们的值,并且在int您显示的操作上不会溢出.然后你将结果(有类型int)分配给unsigned int,因为它是非负的,没有什么奇怪的事情发生.
如果您尝试使用第二个示例unsigned int而不是unsigned short,则可以观察到"整数溢出"(由于无符号算术包装,因此没有真正的溢出).
| 归档时间: |
|
| 查看次数: |
265 次 |
| 最近记录: |