c - 在 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
解决方案
...否则,如果具有无符号整数类型的操作数的等级大于或等于另一个操作数类型的等级,则将具有符号整数类型的操作数转换为具有无符号整数类型的操作数的类型。...
在 中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)。
推荐阅读
- matlab - 如何计算加权 psnr?
- mysql - 无法通过 PhpStorm 连接到 MariaDB,但终端工作正常
- amazon-web-services - 在 AWS Lambda 中接收和发送 multipart/form-data 文件
- python - psycopg2.ProgrammingError: 不完整的占位符: '%(' without ')'
- python-3.x - Python cv2返回其他大小的numpy数组而不是指定的
- spring - 在 Chrome 中的 Oauth2 重定向期间 Cookie 丢失
- wordpress - 永久链接和自定义分类/自定义帖子类型的问题
- asp.net - 如何在 .net API 代码中查找对 API 端点的请求被处理的位置?
- android - 如何使向上按钮返回而不是打开导航抽屉
- android - javax.net.ssl.SSLHandshakeException:使用 okhttp3:okhttp:4.2.2 在 api 级别 28 和 29 上握手失败