C语言中关于char和int的问题

char和int的定义我是清楚的,现在有一个问题:设A和B是int型,C是char型,那么if(C<(A-B))这个语句可不可以,有没有BUG存在?设A和B是char型,... char和int的定义我是清楚的,现在有一个问题:
设A和B是int型,C是char型,那么
if (C<(A-B)) 这个语句可不可以,有没有BUG存在?
设A和B是char型,C是int型,那么
C=(A+B); 这个语句有没有问题呢?
求大侠解答,谢谢!
展开
 我来答
Pro_stars
推荐于2017-09-01 · TA获得超过159个赞
知道答主
回答量:30
采纳率:0%
帮助的人:32.9万
展开全部

    C语言是一种弱类型语言,如果使用熟练了你就会知道,类型什么的都是浮云,内存才是王道,考虑问题的时候要深入本质才行,关于这个问题从内存来看,如下:

  1. char是字符型,内存中占用 1 个字节,取值范围是-128到127,int类型占用 4 个字节,范围就不说了,肯定是比char要大的多,这两个都是有符号数。

  2. char和int一般情况下是可以直接做加减运算的,你可以直接把char当成一个int,只不过取值范围小点;

  3. 不同类型的数值在做运算时,以尽量不丢失有效数据为原则,比如char和int相加,系统会自动把char转换成int,最终结果也是int型;

  4. 赋值时如果类型不一样,要小心,若等号左边的类型小于右边的,会产生截断赋值(特别注意),大于的话就没问题,不会丢失有效数据。

  5. 如你写的第一句,A-B是int,C是char,比较时会先把char转换成int,也就是从1个字节变成4个字节,肯定不会丢失有效数据,没问题;

  6. 第二句,A+B是int,要赋值给char型C,相当于把4个字节的信息装到1个字节的内存中,这肯定放不下,因此会产生截断赋值,取A+B结果的最后一个字节赋值,前面三个字节则会丢掉,

    所以这些写会有风险(当然编译肯定是过的,只是警告罢了),这种情况下,如果A+B结果没超过char取值范围,也问题,因为不会丢失有效数据,如果超过了的话,结果就不是它应该有的结果了,这是就要小心了,所以一般别这么写,除非你确定数据不会越界,一旦越界就会截断赋值(只是结果不对,但程序也不会崩溃的)。

追问
写的好详细,其实第二题的前提条件变了,A和B变为int,C是char.
不过根据您的回答我能判断出第二句应该也是成立的了,谢谢!也谢谢其他人了,只好选择最详细的了,不好意思
追答
汗,没看仔细,不过你明白就好了!
cqpcy
2013-11-04 · TA获得超过658个赞
知道小有建树答主
回答量:746
采纳率:66%
帮助的人:362万
展开全部
char 占一个字符
int 占四个字符
两者不能直接比较
解决方法为强制转换后进行比较
C=(A+B); 这个就更离谱,一个char怎么能容下int,必然会出现内存越界访问问题,引起程序崩溃
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友180fa75
2013-11-04 · TA获得超过337个赞
知道小有建树答主
回答量:416
采纳率:100%
帮助的人:246万
展开全部
语法角度上来说,是没有问题的,如果不同类型的变量做比较的时候,会同意转换为ASCII码,比较或者计算。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xoaxa
2013-11-04 · TA获得超过8609个赞
知道大有可为答主
回答量:6415
采纳率:72%
帮助的人:3458万
展开全部
首先你能否确定在你的C平台上,char是unsigned(无符号)还是signed(有符号)?
假定是有符号类型,则char可表示的范围是-128 -- 127,且A - B的范围也在此内,那么无论平台如何转换,都能给出正确结果;如果A - B超出该范围,平台势必会将C的类型扩展到int类型,以便于给出比较结果,目前流行的平台大都能够做出合理的扩展。
如果char是无符号类型,而A - B小于零,这该如何是好呢?

对于第二个问题则不是问题,完全可以给出正确结果。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
chc05
2013-11-04 · 超过16用户采纳过TA的回答
知道答主
回答量:64
采纳率:0%
帮助的人:43.8万
展开全部
f (C<(A-B)) 可以运行,char 是范围更小的 int
C=(A+B); 这个语句有问题:可能会溢出。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式