【C语言】数据类型的扩充和截断
文章目录
- (一)数据类型扩充
- (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语言】数据类型的扩充和截断相关推荐
- 一起学习C语言:C语言数据类型(二)
上一篇<一起学习C语言:C语言数据类型(一)>中,我们了解到"位与字节"的含义,并分析无符号短整形和有符号短整形的运算方式.本篇文章中,我们进行分析二进制到八进制.十六 ...
- 单片机c语言对应的数据类型有,单片机C语言数据类型.doc
单片机C语言数据类型 单片机C语言的数据类型 在最小系统的介绍中,我们已经大致了解了单片机的程序结构,下面我们来系统介绍一下. 先来简单说说C语言的标识符和关键字.标识符是用来标识源程序中某个对象的名 ...
- c语言定义字符类型变量的关键字,C语言数据类型
C语言关键字: 也称保留字,是C语言预先定义的.具有特殊意义的单词. 数据类型关键字(12个): (1)char:声明字符型变量或函数 (2)double:声明双精度变量或函数 (3)enum:声明枚 ...
- C语言数据类型所占空间大小
C语言数据类型所占空间大小 /* * datasize.c -- print the size of common data items * This runs with any Linux kern ...
- R语言数据类型:Logical、Numeric、Integer、Complex、Character、Vectors、Lists、Matrices、Arrays、Factors、DataFrames
R语言数据类型:Logical.Numeric.Integer.Complex.Character.Vectors.Lists.Matrices.Arrays.Factors.DataFrames 通 ...
- R语言数据类型及数据类型判断
R语言数据类型及数据类型判断 目录 R语言数据类型及数据类型判断 从存储角度看R数据类型
- C语言数据类型大学霸IT达人
C语言数据类型大学霸IT达人 在人们的生活中会处理大量的数据,在处理数据之前我们会对数据进行分类.如一年有356天,12个月.在处理天和月的数据中会使用到整数.在超市的找零时我们会使用到以元为单位的小 ...
- 嵌入式c语言为什么变量定义在前面,嵌入式C语言数据类型和变量详解
原标题:嵌入式C语言数据类型和变量详解 一般来讲,标准的C语言类型在嵌入式编译器中是合法的.但由于嵌入式控制器的受限环境.嵌入式c语言的变量和数据类型具有新的特征,这些特征体现在如下方面. 嵌入式C语 ...
- 声明对象_计算机各语言数据类型及对象声明之区别
各语言数据类型 JS中数据类型有:整数型.浮点型.String.布尔型.转义字符.未定义.空值(null) JAVA中数据类型有: byte short int long float double b ...
最新文章
- 金鱼会开车?对,以色列新研究证明金鱼有陆地导航能力,还能看标志认出目的地...
- Yuan先生的博客网址
- LINUX 上的 Shebang 符号(#!)
- 你确定不反编译 likely 看看?
- HTML和CSS进阶
- 面向对象之Python的链表实现(二)循环链表
- android sdk环境配置_Mac 配置adb环境的方法
- (C语言)用C语言编写小游戏——扫雷
- 概率论与数理统计(一):教你一步步推贝叶斯公式
- MAC下的环境变量设置
- cad文件如何转pdf图纸进行标准的打印
- pwnable - mistake
- lol服务器修复失败,LOL客户端BUG遍地,服务器瘫痪长达一天!官方修复后毫无补偿引不满...
- docx文件格式转PDF格式
- 工程师笔记|STM32U5带OEM Key保护的RDP降级
- ReactNative bug:Application has not bean registered.This is either due to require()error dur
- 《信息安全技术 关键信息基础设施安全保护要求》国家标准在京发布
- 学python怎么样
- 音乐消除国界、下载废除权限:歌曲地址解析器 yosong
- spring session、spring security和redis整合的简单使用