C 将unsigned long强制转换为int时是否存在获取垃圾值的风险?

C 将unsigned long强制转换为int时是否存在获取垃圾值的风险?,c,C,我想将数组大小(X)分配给int。由于数组_SIZE(X)是一个无符号长字符串,因此在int中获取垃圾值是否有任何风险 #define ARRAY_SIZE(X) (sizeof((X))/sizeof((X)[0])) int m = ARRAY_SIZE(X) 是否存在在m中获取垃圾值的风险?如果数组大小(x)中的值大于int中所能容纳的值,您会情不自禁地获取垃圾值。您不应该获取垃圾值(如完全不可预测的值) 当值不适合目标类型时,缩小到有符号类型的转换将由实现定义,或者它们将发出信号()

我想将
数组大小(X)
分配给
int
。由于
数组_SIZE(X)
是一个
无符号长字符串,因此在
int
中获取垃圾值是否有任何风险

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

是否存在在
m
中获取垃圾值的风险?

如果
数组大小(x)
中的值大于
int
中所能容纳的值,您会情不自禁地获取垃圾值。

您不应该获取垃圾值(如完全不可预测的值)

当值不适合目标类型时,缩小到有符号类型的转换将由实现定义,或者它们将发出信号()

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


(如果存储到unsigneds中,转换将始终得到很好的定义,您只需比较值(unsigned类型中没有符号)以验证是否存在信息丢失。)

仅当值大于
INT\u MAX
时。整数强制转换是定义良好的。
ARRAY\u SIZE(X)
SIZE\u t
,您确实应该将其用作
m
的类型。为什么您要问,当您已经有一个生成垃圾的示例时,是否存在任何风险?@ScottHunter,事实上,我想确定原因是强制转换问题。为了理解为什么要迂腐,您可以在处理之前检查
if(ARRAY_SIZE(X)>INT_MAX){…error handling…}
当数组大小为0时,我获取垃圾值如果元素是数组的一部分,并且数组大小为0,您希望元素大小是多少?@MOHAMED-数组大小不允许为0。你的编译器应该抱怨