This question already has an answer here:
Unsigned to signed conversion in C
                                
                                    (1个答案)
                                
                        
                                2年前关闭。
            
                    
我想将ARRAY_SIZE(X)分配给int。因为intARRAY_SIZE(X),所以在unsigned long中有没有获得垃圾值的风险?

#define ARRAY_SIZE(X) (sizeof((X))/sizeof((X)[0]))
int m = ARRAY_SIZE(X)


m中获得垃圾值有风险吗?

最佳答案

您不应该获取垃圾值(因为完全不可预测)。

当该值不适合目标类型时,将转换缩小为带符号类型将是实现定义的,否则将发出信号(6.3.1.3p3)。

如果它们没有发出信号,则可以通过检查源和目标的值和符号是否相同来验证是否没有信息丢失。

(如果存储为无符号,则转换将始终定义良好,并且您只需要比较值(无符号类型中没有符号)即可验证没有信息丢失。)

09-08 00:54