首页 > 其他分享 >【C语言】分析整型提升|截断

【C语言】分析整型提升|截断

时间:2024-08-23 19:53:00浏览次数:8  
标签:0000 符号 C语言 1111 截断 整型 提升 1000

这里通过例子来帮助理解整型提升和截断的规则。
问题:

  1. 赋值过程是怎样的?什么情况会发生截断?
  2. 整型提升的规则是什么? 根据什么类型来提升?
  3. %d, %u对整型提升后的结果有什么影响?

例一

#include <stdio.h>
int main()
{
	char a = -128;
	printf("%d\n", a);
	printf("%u\n", a);
	return 0;
}

运行这段代码的结果如下:
在这里插入图片描述
char如果不加unsigned默认是有符号类型。
为什么会出现两种不同的结果?
分析:

  1. -128是一个4字节整型,在内存中存储它的补码。
    原码
    1000 0000 0000 0000 0000 0000 1000 0000
    反码(符号位不变,其余取反)
    1111 1111 1111 1111 1111 1111 0111 1111
    补码 (反码+1)
    1111 1111 1111 1111 1111 1111 1000 0000
  2. char a = -128;
    这一步发生截断,将-128的补码后8位赋给a
    1111 1111 1111 1111 1111 1111 1000 0000
  3. 以%d打印的是有符号数:
    这一步将会发生整型提升,提升规则:如果a是有符号数,将a的高位识别为符号位,按照符号位提升到32位。
    a是 1000 0000
    提升后 1111 1111 1111 1111 1111 1111 1000 0000
    %d以有符号识别1111 1111 1111 1111 1111 1111 1000 0000,将被识别成补码形式。所以打印结果就是-128。
  4. 以%u打印的是无符号数:
    这里会发生整型提升, 提升规则:如果a是有符号数,将a的高位识别为符号位,按照符号位提升到32位。
    a是 1000 0000
    提升后 1111 1111 1111 1111 1111 1111 1000 0000
    %u以无符号数识别1111 1111 1111 1111 1111 1111 1000 0000,将被识别成原码形式,打印结果就是4294967168。

例二

#include <stdio.h>
int main()
{
	unsigned char a = -1;
	printf("%d\n", a);
	printf("%u\n", a);
	return 0;
}

结果:
在这里插入图片描述
分析:

  1. -1的原码、反码、补码:
    1000 0000 0000 0000 0000 0000 0000 0001
    1111 1111 1111 1111 1111 1111 1111 1110
    1111 1111 1111 1111 1111 1111 1111 1111
  2. unsigned char a = -1;
    发生截断:
    1111 1111 1111 1111 1111 1111 1111 1111
    a 为1111 1111
  3. %d以有符号类型识别整型提升后的"补码":
    由于a是无符号数,整型提升在前面补0即可,没有符号位,不看符号位。
    提升后:0000 0000 0000 0000 0000 0000 1111 1111
    提升后的a识别为补码,因此结果是255
  4. %u以无符号数识别整型提升后的"原码":
    由于a是无符号数,整型提升在前面补0即可,没有符号位,不看符号位。
    提升后:0000 0000 0000 0000 0000 0000 1111 1111
    将提升后的a识别为原码,打印结果就是255

标签:0000,符号,C语言,1111,截断,整型,提升,1000
From: https://blog.csdn.net/qq_64657314/article/details/141469423

相关文章

  • STM32/ARM-M系列 如何用C语言指针操作寄存器 上篇
    1、操作外设实际上就是操作寄存器使用STM32进行编程,我们一般是用官方提供的库函数(HAL库)来操作各种外设。本质上,每个外设都有自己的一组外设寄存器,操作外设就是操作各种外设寄存器。HAL库的各个库函数就是对他们的寄存器操作的高度抽象后的封装。打开stm32f10x的数据手册的地址......
  • C语言数组介绍(详解)
    数组目录数组概念一维数组⼀维数组的创建和初始化一维数组的基本创建一维数组的初始化数组的类型一维数组的使用数组下标数组元素的打印数组的输入一维数组内存中的储存如何用sizefo计算数组元素个数二维数组二维数字的概念二维数组的创建二维数组的初始化二维数组的......
  • C语言中的数据类型
    在C语言中,主要的数据类型有以下几类:一、基本数据类型整型:int:通常占据4个字节,具体大小取决于编译器和系统架构。用于表示整数。short:一般为2个字节,短整型。long:通常为4个字节或更多,长整型。longlong:至少8个字节,更长的整数类型。浮点型:float:单精度浮点数,......
  • C语言的优势与标准
    目录C语言概述1.1C语言的起源1.2使用C语言的理由1.3C语言标准1.3.1K&RC1.3.2ANSIC/C89标准1.3.3C99标准C语言概述        欢迎大家来到c语言的世界,c语言是一种强大的专业化的编程语言。1.1C语言的起源        贝尔实验室的DennisRitchi......
  • C语言实验报告(软件)
    华中科技大学C语言课程实验报告@目录华中科技大学C语言课程实验报告实验1表达式和标准输入与输出实验1.1实验目的1.2实验内容1源程序改错解答:2程序设计(1)解答:(2)解答:(3)解答:1.3实验小结实验2流程控制实验2.1实验目的2.2实验内容及要求1.......
  • C语言-数组名与&数组名的细节注意
    这篇博客将通过整型数组、字符数组、字符串放在数组中、以及二维数组的数组名与&数组名和各类特殊情况的题目讲解来使得我们对于指针与数组名具有更加深刻的了解。注意:sizeof(数组名)-数组名表示整个数组的-计算的是整个数组的大小&数组名-数组名表示整个数组,取出的是整......
  • 自学C语言
    DAY#0一开始(好好学习,提前内卷!)后面……什么鬼,电子信息工程到底是什么,我要学什么然后#宋浩高数#,#每日英语#学着学着劲头就没了,啊啊啊小说我来了》~《然后又是浑浊,挣扎最近加入了校园的科协预备群,www,一下子感觉亚历山大了(因为看过学长分享,非常想进去,他高一就是进了科协)要学的......
  • 自学C语言
    DAY#3哎,今天忙了很多事,晚上九点才碰到电脑。没什么时间学电脑,又补了一点电脑常识,关于文件还有C盘的一些常识(C盘真的非常非常重要!!)早上弄了校园卡(大学真是个神奇的东西)下午忙忙忙,晚上又学了一点基础知识。和家人发生了矛盾,我好难过/-||||DAY#4(啊啊啊啊,昨天的怎么没有发送......
  • C语言常见概念
    1.编译器1.1编译和链接C语言是一门编译型计算机语言,C语言源代码是文本文件,文本文件本身无法执行,必须通过编译器翻译和链接器的链接,生成二进制的可执行文件,可执行文件才能执行。C语言代码放在.c为后缀的文件中,经过编译和链接2个过程,才能得到可执行程序。•每个源文件(.c)......
  • C语言的语句分类
    C语言的代码是由一条条语句构成的,可分为五类:空语句一个分号就是一个语句,即空语句,一般出现的地方是:这里需要一条语句,但这个语句不需要做任何事。表达式语句在表达式的后面加上分号,构成表达式语句。函数调用语句复合语句成对括号中的代码构成一个代码块,也称复合语句。控......