int n=10的sizeof 为什么是四_C语言int类型隐式转换成unsigned类型两例

53b35289-4c13-eb11-8da9-e4434bdf6706.gif

C语言规定,不同类型的数据在一起运算时,必须转换为相同的数据类型。 转换的方式有两种: 一种是隐式类型转换(又称为自动类型转换),一种是强制类型转换(又称为显式类型转换)。 混合运算中的隐式类型转换规则参见下图 double←float long unsigned int←char  /  short 比如:int数据和double数据混合运算,会隐式转换成double类型运算;int数据和unsigned数据混合运算,会隐式转换成unsigned类型运算。 其中,“有符号的int型隐式转换成无符号的unsigned型”这条规则有时会让人“掉入陷阱”。

例1:

#include

int main()

{unsigned int a=1;

signed int b=-2;

(a+b==-1)?printf("a+b等于-1\n"):printf("a+b不等于-1\n");

(a+b==4294967295)?printf("a+b等于4294967295\n"):printf("a+b不等于4294967295\n");

return 0;

}

这道程序,有初学者认为a+b==-1,所以输出的是:

a+b等于-1

a+b不等于4294967295

实际上输出:

55b35289-4c13-eb11-8da9-e4434bdf6706.png

咦? 怎么a+b又等于-1,又等于4294967295呢? 怎么a+b==-1和a+b==4294967295这两个表达式都为真呢?

5bb35289-4c13-eb11-8da9-e4434bdf6706.png

因为:

a=0x00000001

b=0xfffffffe

a+b=0xffffffff

-1 =0xffffffff

4294967295=0xffffffff

更详细的说明见下面的注释版程序:

/*根据C语言隐式类型转换规则,当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。*/

#include

int main()

{unsigned int a=1;//a是无符号整型

signed int b=-2;//b是有符号整型

//内存中的值如下:

//a=0x00000001

//b=0xFFFFFFFE

//a+b=0xFFFFFFFF

//0xFFFFFFFF作为有符号数补码时,即为-1

//0xFFFFFFFF作为无符号数时,即为4294967295

(a+b==-1)?printf("a+b等于-1\n"):printf("a+b不等于-1\n");

//a+b==-1这个表达式中存在unsigned和int两种类型数据,根据隐式类型转换规则,int要转换成unsigned

//a=0x00000001作为无符号数是1, b=0xFFFFFFFE作为无符号数是4294967294

//-1补码是0xFFFFFFFF,作为无符号数看待就是4294967295

//所以a+b==-1为真 

//所以上一行语句输出a+b等于-1

(a+b==4294967295)?printf("a+b等于4294967295\n"):printf("a+b不等于4294967295\n");

//a+b==4294967295个表达式中存在unsigned和int两种类型数据,根据隐式类型转换规则,int要转换成unsigned

//a=0x00000001作为无符号数是1, b=0xFFFFFFFE作为无符号数是4294967294

//a+b即为4294967295

//所以a+b==4294967295为真

//所以上一行语句输出a+b等于4294967295

return 0;

}

66b35289-4c13-eb11-8da9-e4434bdf6706.jpeg

67b35289-4c13-eb11-8da9-e4434bdf6706.jpeg

例2:

#include

#include

int main()

{

    char a[10]="abcd";

    if(strlen(a)>0)

            printf(">0\n");

    if(strlen(a)>-1)

            printf(">-1\n");

    return 0; 

}

只输出>0

并没有输出>-1

原因:

strlen()函数的返回值是unsigned类型,在和有符号整型数据比较时,有符号整型要转化成unsigned类型,-1若看作无符号数,那它就是最大的整数,strlen(a)>-1就为假。

6ab35289-4c13-eb11-8da9-e4434bdf6706.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值