使用min操作绑定变量值后执行窄化转换是否安全?代码有效性求证
问题解答
你的代码是定义良好的,并且可以保证narrow被初始化为external_uint64_t与MAX_SIZE中的较小值,原因如下:
MAX_SIZE的取值范围:
MAX_SIZE被定义为0x10000000(即228),这个值远小于`uint32_t`的最大值(`0xFFFFFFFF`,即232-1),同时也在uint64_t的取值范围内。min宏的类型提升逻辑:当
external_uint64_t(uint64_t类型)和MAX_SIZE(整数常量)进行比较时,MAX_SIZE会被自动提升为uint64_t类型,因此min宏的结果始终是uint64_t类型的有效值——要么是external_uint64_t(当它小于等于MAX_SIZE时),要么是MAX_SIZE(当它大于MAX_SIZE时)。窄化转换的安全性:
- 若
wide的值是MAX_SIZE,直接转换为uint32_t完全合法,因为该值在uint32_t的范围内。 - 若
wide的值是小于等于MAX_SIZE的external_uint64_t,该值必然也小于等于0x10000000,同样在uint32_t的范围内,因此无符号整数的窄化转换不会产生未定义行为,结果精确对应原数值。
- 若
另外,这里min宏的使用也是安全的——因为传入的参数external_uint64_t是外部变量,没有求值副作用,不会触发宏多次求值导致的问题。
内容的提问来源于stack exchange,提问作者Govind Parmar
相关产品推荐
相关产品推荐

