好好爱自己!

c语言char 和int的问题

参考:http://www.cnblogs.com/dire/p/5222968.html

参考baidu:

char和int的定义我是清楚的,现在有一个问题:

1、设A和B是int型,C是char型,那么if (C<(A-B)) 这个语句可不可以,有没有BUG存在?

2、设A和B是char型,C是int型,那么C=(A+B); 这个语句有没有问题呢?

3、设A和B是int型,C是char型,那么C=(A+B); 这个语句有没有问题呢?

回答:

  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取值范围,也问题,因为不会丢失有效数据,如果超过了的话,结果就不是它应该有的结果了,这是就要小心了,所以一般别这么写,除非你确定数据不会越界,一旦越界就会截断赋值(只是结果不对,但程序也不会崩溃的)。

  7. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #include <stdio.h>
    struct SIMPLE
    {
        int a;
        char b;
    };
     
    int main(){
       //声明结构体变量s1 和 指向结构体变量的指针 s2
        struct SIMPLE s1;
        struct SIMPLE *s2;
     
        s1.a = 5;
        s1.b = 6;
        s2 = &s1;
        printf("%d\n", s2->a);
        printf("%d\n", s2->b);
     
        printf("%d\n", (*s2).a);
        printf("%d\n", (*s2).b);
    }

      

posted @   立志做一个好的程序员  阅读(847)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现

不断学习创作,与自己快乐相处

点击右上角即可分享
微信分享提示