C语言中signed与unsigned char比较导致for循环不执行原因咨询
问题原因说明
你对赋值阶段的类型转换判断是正确的,错误原因是遗漏了C语言的**整数提升(Integer Promotion)**规则,该规则优先级高于同级别操作数的符号转换规则。
具体执行逻辑拆解
- 赋值阶段逻辑正确:
cnt为值-1的char类型,cnt - 2运算时首先会被提升为int类型,得到结果-3,赋值给unsigned char类型的i时,按照无符号类型转换规则截断后的值确实为253。 - 比较
i < cnt时的实际执行逻辑:
所有位宽小于int的整数类型(包括char、unsigned char、short)在参与比较、算术运算前,都会先被提升为int类型:unsigned char类型的i值为253,提升为int后得到int 253char类型的cnt值为-1,提升为int后得到int -1- 实际比较的是
253 < -1,结果为假,因此循环直接退出。
你之前理解的转换规则适用场景
你提到的「有符号和无符号同级别操作数统一转换为无符号类型」的规则,仅在两个操作数经过整数提升后位宽相同、且一个为有符号一个为无符号时才会触发,比如比较unsigned int和int类型的变量时才会走该逻辑,不适用于char级别的类型比较。
内容的提问来源于stack exchange,提问作者baekrang256
相关产品推荐
相关产品推荐

