C语言中的截断与整型提升

我们首先来看一段代码:

#include<stdio.h>
#include<stdlib.h>
union Un//--联合体
{   char c;int i;
};
int main()
{//联合变量的定义union Un un = { 0 };//计算联合变量的大小printf("%d\n", sizeof(un));//--结果为4,联合体按照最大的变量开辟空间// 下面输出的结果是一样的吗?un.c = 129;//        10000001printf("%d\n", un.c);//-127printf("%d\n", un.i);//129system("pause\n");return 0;
}

猜猜结果吧!
来看看真实的结果:

这是为什么呢?这就涉及到了C语言中的截断和整型提升。

截断:

在c语言中进行变量赋值的时候,如果将字节多的数据类型赋给一个字节少的数据类型,会发生“截断”。 发生这种情况的原因是:在赋值过程中只将占字节较长的变量的低位赋给占字节较短的变量。

整型提升:

整型提升是C程序设计语言中的一项规定:在表达式计算时,各种整形首先要提升为int类型,如果int类型不足以表示则要提升为unsigned int类型;然后执行表达式的运算。

我们都知道,int类型是32位(4字节),char类型是8位(1字节)。
129在int类型中的存储格式如下:

129在char类型中,由于char的存储空间不足4字节,所以只会存原int类型的低8位,存储格式如下:

此时,发生截断。 原来的int类型的un.i的值发生截断。
这时候你或许又有疑问了,那结果不应该是:129和129吗?
这又牵扯到了打印的时候整型提升的问题。
首先来熟悉一下整型提升的规则吧:

  1. 若是有符号数,则前面8*3位补符号位。
  2. 若是无符号数,则前面8*3位补0。

现在再来看,原来的char类型的un.c被提升成了int类型,因为这里是有符号char类型(%d格式打印),所以10000001中的第一位被解释为符号位,整型提升为:

到这里你或许又会说,第一个结果应该是上面的二进制换成整数吧。
别急,别急!这又牵扯到了数字在计算机中的存储问题。
计算机存储的是补码,负数的补码是反码+1,正数的补码是它本身。
那我们来求一下上面这个结果的原码吧:

因此:

printf("%d\n", un.c);

的结果为:-127.
我们再了解一下负数在计算机中存储的形式吧:

第二个结果:

printf("%d\n", un.i);

为129。
你或许又迷糊了,刚才赋值的时候,原来的int类型的un.i的值不是发生截断了吗?那它以“%d”形式打印的时候不应该也要整型提升吗?结果和第一个一样啊。
是这样的,un.c占1个字节(8位)所以它最高位的1同时也是符号位,要打印时要把它提升成“%d”要求的有符号的占4个字节的数据。(截断以后进行整数提升)。整数提升以后,又因为它是负数,在计算机中存储的是负数的补码,打印出来的是原码,因此要进行求原码的操作。(如果是负数要先求它存储在计算机里面的补码进行截断再进行上述操作 )
un.c在赋值时发生截断,可是它剩余的三个高位都是0.(24个0),在计算机里是存在的,只是赋值的时候截断了,截取了最低一个字节的8个位。打印的时候其他位补0就可以啦。(如果是负数,要先求补码,再进行截断)(拿un.c=511试,可以知道打印的时候其他位补0,不是补符号位)
你明白了吗?那,小试牛刀如何?

#include<stdio.h>
#include<stdlib.h>
union Un//--联合体
{   char c;int i;
};
int main()
{//联合变量的定义union Un un = { 0 };//计算联合变量的大小printf("%d\n", sizeof(un));//--结果为4,联合体按照最大的变量开辟空间// 下面输出的结果是什么?un.c = -129;printf("%d\n", un.c);//?printf("%d\n", un.i);//?system("pause\n");return 0;
}

结果:

#include<stdio.h>
#include<stdlib.h>
union Un//--联合体
{   char c;int i;
};
int main()
{//联合变量的定义union Un un = { 0 };//计算联合变量的大小printf("%d\n", sizeof(un));//--结果为4,联合体按照最大的变量开辟空间// 下面输出的结果是什么?un.c = 257;printf("%d\n", un.c);//?printf("%d\n", un.i);//?system("pause\n");return 0;
}

结果:

你都做对了吗?没做对的再去复习一下吧。如果你全都做对了,哇哦,perfect,说明这部分内容你已经掌握地很好了呢。

C语言中的截断与整型提升相关推荐

  1. 2.2 Go语言中的布尔型和整型

    变量类型 上一节对Go语言中的变量的定义方法进行了介绍,定义的方式一种是显示,一种为隐式.显示定义需要明确变量类型,而隐式定义则根据赋予的值来决定变量的类型.那么Go语言中到底有多少种变量类型呢?可以 ...

  2. C语言操作符详解 隐式类型转换 (整型提升 算数转换)

    目录 一.算术操作符 二.左移操作符 右移操作符 1.二进制序列 2.左移操作符 3.右移操作符 3.1.逻辑运算/算术运算 3.2.对于移位运算符,不要移动负数位,这是标准未定义的 3.3.对于移位 ...

  3. c语言整形提升规则,C语言进阶:整型提升

    几乎每个程序员都学过C,而且大多数在他们的工作中使用C.很显然C是TIOBE(2012年11月时排榜首)上最流程的编程语言之一.然而,有时,C的行为会让人意外和困惑.其中一个例子就是**整型提升**. ...

  4. C语言基础09——数据在内存中的存储。整型的存储、大小端讲解、浮点数的存储、杨辉三角、找凶手、猜名次

    目录 数据类型 基本内置类型 类型的基本分类 整型在内存中的存储 计算机中整数的三种表示方法:原码.反码.补码 大小端 练习 浮点型在内存中的存储 为什么以下程序输出结果与想象不同? 浮点数存储规则 ...

  5. 一文搞明白整型提升,截断等相关概念【C语言】

    首先看一道题目: 如下程序输出的结果是: int main() {char a = 0xb6;short b = 0xb600;int c = 0xb6000000;if(a==0xb6)printf ...

  6. 隐式类型转换——C语言中的整型提升

    整型提升概念: C语言中的整型算术运算总是至少以缺省整型类型的精度来进行的. 为了获得这个精度,表达式中的字符和短整型操作数在使用之前被转换为普通整型,这种转换称为整型提升. 整型提升的意义 三点说明 ...

  7. c语言整型最大数,C语言:求一个短整型正整数中的最大数字

    C语言:求一个短整型正整数中的最大数字 关注:84  答案:5  手机版 解决时间 2021-01-16 02:17 提问者舊倳偂歡 2021-01-15 14:26 例如整数12354中的最大数字是 ...

  8. java中怎么输入长整型_c语言如何输入长整型 scanf输入长整型

    C语言中无符号长整型数的输入输出格式是什么? 整数变量的分类:basic integer:int short integer:short int long int将修饰符unsigned添加到上述三个 ...

  9. 类型转换:隐式转化(算数转换,整型提升,混合提升,赋值转换),强制转换【C语言】

    类型转换 隐式转化 算数转换 整型提升 混合提升 赋值转换 强制转换 编译器使用注意 小结 类型转换 隐式转化 不需要人为参与而产生的默认转称为隐式转化. 隐式转化,是计算机语言实现层面最难的,指针是 ...

最新文章

  1. linux分区_Linux系统 fdisk管理MBR分区
  2. oracle dg备份恢复,DG丢失归档,使用增量备份恢复一例
  3. Blockquotes,引用,html里面,经常用到的一个!
  4. linux笔记-硬链接和符号链接
  5. IIS 中 另一个程序正在使用此文件,进程无法访问!
  6. eclipse 如何关联git_git的相关操作
  7. 设计模式:第二章--抽象工厂模式
  8. 网络邻居上的计算机没权限,WinXP打开网上邻居提示“您可能没有权限使用网络资源”怎么办?...
  9. yocto-poky下目录结构分析
  10. 简单的创建一个小型服务器
  11. AD2020库安装及查找库
  12. 倍福PLC和C#通过ADS通信传输int类型变量
  13. 《计算机网络》学习笔记----第七版课后习题参考答案 第三章
  14. 【MySQL】1安装与忘记密码
  15. mysql连接校对_mysql字符集和校对规则(Mysql校对集)
  16. 和机器人交互,哪些是本质,哪些不是
  17. 机器视觉技术助力工业物联网发展,起到核心作用。
  18. 英国五大基金公司正在探索区块链
  19. 查看C++源文件的预处理结果
  20. 记录_20190814

热门文章

  1. YUY2转换为RGB的多种方法
  2. 一分钟让你了解人脸识别套件中的双目、单目、3D结构光摄像头的区别以及详细介绍
  3. layuiAdmin多重判断代码。
  4. php判断运营商,利用PHP怎么对手机号的运营商进行判断
  5. 2021年焊工作业熔化焊接与热切割考试题库与解析
  6. 【Android 10 源码】MediaRecorder 录像流程:MediaRecorder 初始化
  7. 49CFR 571.302联邦机动车辆内饰材料的燃烧特性
  8. 电力系统 接线图,配电图,地理接线图,电力系统组态与仿真,电力调度,自动控制,VC++和DELPHI以及web应用示例与源代码...
  9. png格式和jpg格式的文件的区别 ?
  10. EPLAN 软件平台中的词“点“大全