文章目录

  • (一)数据类型扩充
    • (1)表示范围小的整型变量赋值给表示范围大的整型变量
  • (二)数据的截取(切片)
    • (1)将数据类型较大的变量赋给数据类型较小的变量
  • (三)算术类型转换和赋值类型转换
    • (1)类型运算、转换规则
    • 例(1)
    • 例(2)
    • 例(3)
    • 例(4)肥肠重要!!!!!!!!
    • 例(5)肥肥非常重要!!!!!!!!!

(一)数据类型扩充

(1)表示范围小的整型变量赋值给表示范围大的整型变量

前提:

  • 不改变值的正负
  • 不改变值的大小

规则:

  • 无符号整数,直接补0。
  • 有符号整数,扩充符号位。
  • 与左值的有无符号无关(例:short x = a; 与x是否有符号无关


(二)数据的截取(切片)

(1)将数据类型较大的变量赋给数据类型较小的变量

  • 规则:无论有无符号,丢弃高位数据

(三)算术类型转换和赋值类型转换

  • 自动类型转换:隐式类型转换
  • 强制类型转换:显示类型转换

类型相容:

  • 类型不同,但系统(编译器在编译阶段)可以自动类型转换(低精度——>高精度,小范围——>大范围),只针对基本数据类型
  • 基本数据类型:char、short、 int、long、long int、long long、unsigned char、unsigned short、unsigned int、 unsigned long int、unsigned long long,float、double类型
  • 特定类型:指针、数组、结构体类型(不支持强转)、联合体类型、枚举类型不适用

(1)类型运算、转换规则

例(1)

#include <stdio.h>int main()
{char a = -5;unsigned int b = 10;if (a > b){printf("%d > %d\n", a, b);//无符号输出printf("%u > %u\n", a, b);}else{printf("%d < %d\n", a, b);}return 0;
}

分析:

  • a和b进行比较时,signed char类型的a会自动转换成 unsigned int类型
  • a = -5对应一字节补码1111 1011 , 将补码扩充到4字节,对应的补码就是1111 1111 1111 1111 1111 1111 1111 1011
  • 再将扩充后的补码1111 1111 1111 1111 1111 1111 1111 1011解析成无符号类型(正数),对应的原码就是1111 1111 1111 1111 1111 1111 1111 1011 对应的十进制 远远大于10

结果:

例(2)

#include <stdio.h>int main()
{char a = -5;          //int 4字节补码1111 1111 1111 1111 1111 1111 1111 1011(-5)unsigned short b = 10;   //int 4字节补码0000 0000 0000 0000 0000 0000 0000 1010(10)//char 和short都转成int 类型if (a > b){printf("%d > %d\n", a, b);//无符号输出printf("%u > %u\n", a, b);}else{printf("%d > %d\n", a, b);}return 0;
}

分析:
当char类型和short类型进行转化时,都会转成signed int类型

  • char a = -5; //int 4字节补码1111 1111 1111 1111 1111 1111 1111 1011(-5)
  • unsigned short b = 10; //int 4字节补码0000 0000 0000 0000 0000 0000 0000 1010(10)

结果:

例(3)

#include <stdio.h>int main()
{/*分析:sizeof(int)== 4的值是一个unsigned int类型比较时,signed int 会转成 unsigned int类型-3补码:1111 1111 1111 1111 1111 1111 1111 11014补码:0000 0000 0000 0000 0000 0000 0100以无符号来解读1111 1111 1111 1111 1111 1111 1111 1101就是很大的数 > 4所以不进入循环*/for (int i = -3; i < sizeof(int); i++){printf("%d ", i);}`在这里插入代码片`return 0;
}
  • 结果:

例(4)肥肠重要!!!!!!!!

#include <stdio.h>int main()
{char a = 100;         char b = 200;      char c = a + b;       /* 有符号100:   0110 0100-56:   1100 1000c =  44: 1 0010 1100(截取低地址8位)%d输出表示再对c进行int类型扩充:0000 0000 0000 0000 0000 0000 0010 1100(44)*///%d格式符代表以有符号整型输出 a + b/*分别将char的a、b扩充成int,在对其补码进行运算a`: 0000 0000 0000 0000 0000 0000 0110 0100b`: 1111 1111 1111 1111 1111 1111 1100 10001 0000 0000 0000 0000 0000 0000 0010 1100(截取低地址32位)结果:`a + `b = 44*/printf("c = %d, a + b = %d\n", c, a + b);unsigned char ua = 100;unsigned char ub = 200;unsigned char uc = ua + ub;/*无符号100: 0110 0100200: 1100 1000uc:1 0010 1100(截取低地址8位)以%d输出uc0000 0000 0000 0000 0000 0000 0010 1100(44)-------------------------------------------以%d输出 ua + ub先将ua、ub扩充成intua`: 0000 0000 0000 0000 0000 0000 0110 0100ub`: 0000 0000 0000 0000 0000 0000 1100 1000ua` + ub`:0000 0000 0000 0000 0000 0001 0010 1100(300)*/printf("uc = %d, ua + ub = %d\n", uc, ua + ub);return 0;
}
  • 结果:

例(5)肥肥非常重要!!!!!!!!!

#include <stdio.h>int main()
{char c = 128;unsigned char uc = 128;unsigned short usum = 0;/*有符号c:  1000 0000(魔鬼数-128)无符号uc: 1000 0000无符号short usum:扩充后:c: 1111 1111 1000 0000uc:0000 0000 1000 0000补码运算:1 0000 0000 0000 0000(取低地址16位)->0*/usum = c + uc;printf("%x\n", usum);/*有符号c:  1000 0000(魔鬼数-128)无符号uc: 1000 0000强转无符号c:  1000 0000无符号uc: 1000 0000无符号char usum:扩充:c: 0000 0000 1000 0000uc:0000 0000 1000 0000补码运算:0000 0001 0000 0000(取地址16位)->(0x100)*/usum = (unsigned char)c + uc;printf("%x\n", usum);/*有符号c:  1000 0000(魔鬼数-128)无符号uc: 1000 0000uc强制转成有符号:1000 0000c和uc再转成unsigned shortc: 1111 1111 1000 0000uc:1111 1111 1000 0000补码运算:    1 1111 1111 0000 0000(取低地址16位0xff00)*/usum = c + (char)uc;printf("%x\n", usum);/*有符号c:  1000 0000(魔鬼数-128)无符号uc: 1000 0000c扩充无符号shortc: 1111 1111 1000 0000uc扩充成无符号shortuc: 0000 0000 1000 0000补码运算:1 0000 0000 0000 0000(取低地址16位 0x00)*/usum = (unsigned short)c + uc;printf("%x\n", usum);return 0;
}
  • 结果:

【C语言】数据类型的扩充和截断相关推荐

  1. 一起学习C语言:C语言数据类型(二)

    上一篇<一起学习C语言:C语言数据类型(一)>中,我们了解到"位与字节"的含义,并分析无符号短整形和有符号短整形的运算方式.本篇文章中,我们进行分析二进制到八进制.十六 ...

  2. 单片机c语言对应的数据类型有,单片机C语言数据类型.doc

    单片机C语言数据类型 单片机C语言的数据类型 在最小系统的介绍中,我们已经大致了解了单片机的程序结构,下面我们来系统介绍一下. 先来简单说说C语言的标识符和关键字.标识符是用来标识源程序中某个对象的名 ...

  3. c语言定义字符类型变量的关键字,C语言数据类型

    C语言关键字: 也称保留字,是C语言预先定义的.具有特殊意义的单词. 数据类型关键字(12个): (1)char:声明字符型变量或函数 (2)double:声明双精度变量或函数 (3)enum:声明枚 ...

  4. C语言数据类型所占空间大小

    C语言数据类型所占空间大小 /* * datasize.c -- print the size of common data items * This runs with any Linux kern ...

  5. R语言数据类型:Logical、Numeric、Integer、Complex、Character、Vectors、Lists、Matrices、Arrays、Factors、DataFrames

    R语言数据类型:Logical.Numeric.Integer.Complex.Character.Vectors.Lists.Matrices.Arrays.Factors.DataFrames 通 ...

  6. R语言数据类型及数据类型判断

    R语言数据类型及数据类型判断 目录 R语言数据类型及数据类型判断 从存储角度看R数据类型

  7. C语言数据类型大学霸IT达人

    C语言数据类型大学霸IT达人 在人们的生活中会处理大量的数据,在处理数据之前我们会对数据进行分类.如一年有356天,12个月.在处理天和月的数据中会使用到整数.在超市的找零时我们会使用到以元为单位的小 ...

  8. 嵌入式c语言为什么变量定义在前面,嵌入式C语言数据类型和变量详解

    原标题:嵌入式C语言数据类型和变量详解 一般来讲,标准的C语言类型在嵌入式编译器中是合法的.但由于嵌入式控制器的受限环境.嵌入式c语言的变量和数据类型具有新的特征,这些特征体现在如下方面. 嵌入式C语 ...

  9. 声明对象_计算机各语言数据类型及对象声明之区别

    各语言数据类型 JS中数据类型有:整数型.浮点型.String.布尔型.转义字符.未定义.空值(null) JAVA中数据类型有: byte short int long float double b ...

最新文章

  1. 金鱼会开车?对,以色列新研究证明金鱼有陆地导航能力,还能看标志认出目的地...
  2. Yuan先生的博客网址
  3. LINUX 上的 Shebang 符号(#!)
  4. 你确定不反编译 likely 看看?
  5. HTML和CSS进阶
  6. 面向对象之Python的链表实现(二)循环链表
  7. android sdk环境配置_Mac 配置adb环境的方法
  8. (C语言)用C语言编写小游戏——扫雷
  9. 概率论与数理统计(一):教你一步步推贝叶斯公式
  10. MAC下的环境变量设置
  11. cad文件如何转pdf图纸进行标准的打印
  12. pwnable - mistake
  13. lol服务器修复失败,LOL客户端BUG遍地,服务器瘫痪长达一天!官方修复后毫无补偿引不满...
  14. docx文件格式转PDF格式
  15. 工程师笔记|STM32U5带OEM Key保护的RDP降级
  16. ReactNative bug:Application has not bean registered.This is either due to require()error dur
  17. 《信息安全技术 关键信息基础设施安全保护要求》国家标准在京发布
  18. 学python怎么样
  19. 音乐消除国界、下载废除权限:歌曲地址解析器 yosong
  20. spring session、spring security和redis整合的简单使用

热门文章

  1. 使用Python进行Excel文件拆分
  2. 功能强大、多合一,Java性能调优VisualVM多合一工具
  3. 强烈推荐:一款中文AI问答、创作、绘画工具
  4. int和long类型取值范围。 基本数据类型 byte , short , char ,int , long , float ,double,boolean类型取值范围
  5. SendMessgae
  6. FBW7通过端粒脱帽介导肺纤维化和衰老
  7. php短网址生成代码,一个php短网址的生成代码(仿微博短网址)
  8. 一文读懂上拉电阻:工作原理和阻值确定
  9. 易语言误报优化助手 v1.5
  10. DDoS攻击流量检测方法