如果需要比较
int x
和 unsigned int y
,在使用 C99
和 gcc 4.4+
时哪种方式更安全/更好/更好看:
(unsigned int)x == y
x == (int)y
这有影响吗?
int x
和 unsigned int y
,在使用 C99
和 gcc 4.4+
时哪种方式更安全/更好/更好看:
(unsigned int)x == y
x == (int)y
这有影响吗?
最安全的方法是在转换之前检查数字是否在范围内:
if (x >= 0 && ((unsigned int)x) == y)
y < INT_MAX/2
,那么做 (int)y
可以吗? - Cartesius00y < INT_MAX
。 - Cartesius00int
和unsigned
具有相同的转换等级,并且根据6.3.1.8 ("否则,如果具有无符号整数类型的操作数的等级大于或等于另一个操作数的类型的等级,则具有带符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型。"),int
应该总是被转换为unsigned
。不是吗? - undur_gongorx
是 int
),强制转换是不必要的:if (x >= 0 && x == y)
就可以了。 - cafint x = -1;
unsigned y = 0xffffffff;
x == y
将返回1
,因为通过"通常算术转换"将x
的值转换为unsigned
,进而转换为0xffffffff
。(unsigned int)x == y
也将返回1
。唯一的区别是你用显式的强制转换进行转换。x == (int)y
很可能也会返回1
,因为在大多数平台上,将0xffffffff
转换为int
会得到-1
(二进制补码负数)。严格来说,这是实现定义行为,因此在不同平台上可能会有所不同。0
。一个好的实现在Mark Byers的答案中给出。