为了账号安全,请及时绑定邮箱和手机立即绑定

类型转换 - unsigned to signed int / char

类型转换 - unsigned to signed int / char

C
繁星点点滴滴 2019-08-16 17:13:07
类型转换 - unsigned to signed int / char我试过执行以下程序:#include <stdio.h>int main() {     signed char a = -5;     unsigned char b = -5;     int c = -5;     unsigned int d = -5;     if (a == b)         printf("\r\n char is SAME!!!");     else         printf("\r\n char is DIFF!!!");     if (c == d)         printf("\r\n int is SAME!!!");     else         printf("\r\n int is DIFF!!!");     return 0;}对于这个程序,我得到输出:char是DIFF !!! int是相同的!为什么我们两者都有不同的输出?输出应该如下?char是相同的!int是相同的!一个键盘连接。
查看完整描述

3 回答

?
largeQ

TA贡献2039条经验 获得超7个赞

这是因为C中的各种隐式类型转换规则.C程序员必须知道其中有两个:通常的算术转换整数提升(后者是前者的一部分)。

在char情况下,你有类型(signed char) == (unsigned char)。这些都是小整数类型。其他这样的小整数类型是boolshort。该整数提升规则指出,当一个小的整数类型是操作的操作数,它的类型将得到提升到int,这是签署。无论类型是签名还是未签名,都会发生这种情况。

在这种情况下signed char,符号将被保留,并将被提升为int包含值-5 的符号。在它的情况下unsigned char,它包含一个值251(0xFB)。它将被提升为int包含相同值的。你结束了

if( (int)-5 == (int)251 )

在整数的情况下,您有类型(signed int) == (unsigned int)。它们不是小整数类型,因此整数促销不适用。相反,它们通常通过算术转换进行平衡,该转换声明如果两个操作数具有相同的“等级”(大小)但签名不同,则签名操作数将转换为与无符号操作数相同的类型。你结束了

if( (unsigned int)-5 == (unsigned int)-5)


查看完整回答
反对 回复 2019-08-16
?
侃侃无极

TA贡献2051条经验 获得超10个赞

好问题!

int比较有效,因为这两个整数包含完全相同的位,所以他们基本上是相同的。但那是什么char

啊,C 在各种场合暗中提升charint。这是其中之一。你的代码说if(a==b),但编译器实际上转向的是:

if((int)a==(int)b)

(int)a是-5,但是(int)b是251.这些肯定是不一样的。

编辑:正如@ Carbonic-Acid指出的那样,(int)b只有当a char为8位长时才是251 。如果int是32位长,(int)b则为-32764。

REDIT:如果一个字节长度不是8位,那么就会有很多评论讨论答案的本质。在这种情况下唯一的区别是,(int)b不是251而是一个不同的数,而不是-5。这与仍然非常酷的问题无关。


查看完整回答
反对 回复 2019-08-16
  • 3 回答
  • 0 关注
  • 1053 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信