首页 > 解决方案 > 在 C 语言中比较两个不同符号时会发生什么?

问题描述

我在fabien sanglard 的网站上找到了这段代码。我是 C 编程语言的新手,我需要很好地解释这段代码以及如何使 -1 大于 1。

unsigned int   ui_one       =  1 ;
signed   int   i_one        =  1 ;
signed   short s_minus_one  = -1 ;

if( s_minus_one > ui_one)
    printf("-1 > 1 \n");

if( s_minus_one < i_one) 
    printf("-1 < 1 \n");

#./run
#
# -1 > 1 
# -1 < 1

标签: cint

解决方案


通常的算术提升 (6.3.1.8)适用

...否则,如果具有无符号整数类型的操作数的等级大于或等于另一个操作数类型的等级,则将具有符号整数类型的操作数转换为具有无符号整数类型的操作数的类型。...

在 中if( s_minus_one > ui_one)s_minus_one转换为unsigned int

转换由6.3.1.3p2 控制

否则,如果新类型是无符号的,则在新类型可以表示的最大值的基础上重复加减一,直到该值在新类型的范围内。

所以你(unsigned int)s_minus_one会得到你UINT_MAX并且UINT_MAX大于ui_one

在 gcc 和 clang 上,您可以使用-Wsign-compare -Wconversion(或使用-Wextra)进行编译以获取有关这些转换的警告(https://gcc.godbolt.org/z/dZ6L-y)。


推荐阅读