#include<stdio.h> int main() { unsigned int b=1; char a=-1; printf("%d",a-b); printf("%d",a-b<0); }
4个回答
2012-11-08
展开全部
先要了解c语言的隐式类型转换和强制类型转换概念,在对不同数据类型运算时,会有默认类型转换,简单来说就是非整形-》整形,有符号-》无符号。
代入你的例子:
1) a-b: a提升为unsigned int = 0xffff ffff, a -b的结果是unsigned int = 0xffff fffe
2) printf("%d", a-b), 因为你用%d就是int输出,等于强制类型转换为int,无符号的0xffff fffe 就变成 -2 了
3) printf("%d",a-b<0), 0是常量,常量默认为int,与unsigned int结果比较也要提升为 unsigned int,还是0,表达式 ,a-b<0 就相当于(unsigned int)(a-b)< (unsigned int)0,也就是 0xffff fffe < 0 ,这是个关系运算,结果当然是FALSE,也就0。
代入你的例子:
1) a-b: a提升为unsigned int = 0xffff ffff, a -b的结果是unsigned int = 0xffff fffe
2) printf("%d", a-b), 因为你用%d就是int输出,等于强制类型转换为int,无符号的0xffff fffe 就变成 -2 了
3) printf("%d",a-b<0), 0是常量,常量默认为int,与unsigned int结果比较也要提升为 unsigned int,还是0,表达式 ,a-b<0 就相当于(unsigned int)(a-b)< (unsigned int)0,也就是 0xffff fffe < 0 ,这是个关系运算,结果当然是FALSE,也就0。
展开全部
a=-1
b=1
a-b=(-1)-1=-1+(-1)=-2
a-b<0 如上a-b=-2 -2<0产生一个布尔值为true,在c中true为1
但是这里为什么为0呢?
只是因为字符的关系
这里的a-b=-2是一个字符
printf("%d",'-2' < 0); /*输出为0*/
printf("%d",-2 < 0); /*输出为1*/
您可以尝试输出a-b的ascii码 希望能解决您的问题
b=1
a-b=(-1)-1=-1+(-1)=-2
a-b<0 如上a-b=-2 -2<0产生一个布尔值为true,在c中true为1
但是这里为什么为0呢?
只是因为字符的关系
这里的a-b=-2是一个字符
printf("%d",'-2' < 0); /*输出为0*/
printf("%d",-2 < 0); /*输出为1*/
您可以尝试输出a-b的ascii码 希望能解决您的问题
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
字符型和无符号整形运算都转换成整形,整形范围-32767到32768,你可以改革超过这个范围的数,结果就试试简单的加减了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
printf("%d",a-b); a-b=-1-1=-2
printf("%d",a-b<0); -2<0结果为false, false就是0
printf("%d",a-b<0); -2<0结果为false, false就是0
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询