【整型提升】

本文深入探讨了计算机中整数的补码存储方式及其原因,详细介绍了原码、反码和补码的概念。通过实例分析了C语言中不同类型的char(包括有符号和无符号)在存储和转换为%d和%u时的处理过程,展示了数值在内存中的扩展和解释规则。最后,通过具体代码展示了-1和-128在不同char类型和输出格式下的表现,揭示了类型转换和位填充的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【整型提升——浅析】

1.预备知识

1.1 —整形在计算机中的存储

对于整形来说,数据在内存中是以补码的形式存储的,Why?

​ 在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值 域统一处理;同时和减法一样也可以统一处理(CPU只有加法器),此外,补码与源码相互转换,其运算过程是相同的,不需要额外的硬件电路。

1.2.原码、反码、补码

​ 计算机中的符号数有三种表示方法,即源码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用 0 表示“正”,用 1 表示“负”,而数值位,三种方法表示各不相同。

原码: 直接将二进制按照正负数的形式表示成二进制就可以了;

反码: 将源码的符号位不变,其它位依次按位取反即可得到;

补码: 反码 + 1 得到补码。

注:正数的原、反、补码都相同

补充: char(8bit)取值范围 : -128 ~ +127 ,即 -2^(7) ~ 2^(7)-1

1 1000 0000 (我们可以想象 该值存在寄存器里,所以第9位可以存在)

1 0111 1111

1 1000 0000

则我们规定:10000000-128

2.案例分析

2.1 求解下列代码输出的结果

#include <stdio.h>

void test()
{
	 char a = -1;
	 signed char b = -1;
	 unsigned  char c = -1;
	 printf("%d %d %d\n ", a, b, c);

}

int main()
{
    test();
    system("pause");
    return 0;
}

解题思路:

Step1求取其在计算机中存储的二进制编码 (原—反—补)

Step2:添加bit位,数量根据最终类型而定,(根据变量本身类型,即添加全0 或全1 )

Step3:解释,根据最终输出类型(无符号还是有符号);有符号->根据Step2 二进制形式符号位,即最高位为0或1,进行输出,为0直接输出二进制;为1,二进制形式 - 1再取反。无符号(unsigned xxx)-> 直接输出

  • 例: char a = -1;
  1. a在计算机存储的形式(二进制):10000001(原) ->11111110(反)->11111111(补);

  2. 添加bit位(因为最终输出为 %d大小为4byte, 所以添加之后bit 数量为 4*8bit),变量 a 类型为 char为有符号类型,则添加全1 -> 11111111 11111111 11111111 11111111 ;

  3. 解释,根据最终输出类型为%d (有符号整形),那么再看第2步结果的最高位(既符号位)为1,则最终输出为:~(11111111 11111111 11111111 11111111 - 1)-> 10000000 00000000 00000000 00000001 (十进制形式为 -1); (signed char a为有符号类型,与char a 分析一样)

  • 例: unsigned char c = -1;
  1. c在计算机存储的形式(二进制):10000001(原) ->11111110(反)->11111111(补);

  2. 添加bit位(因为最终输出为 %d大小为4byte, 所以添加之后bit 数量为 4*8bit),变量 c 类型为 unsigned char为无符号类型,则添加全0 -> 00000000 00000000 00000000 11111111;

  3. 解释,根据最终输出类型为%d (有符号整形),那么再看第2步结果的最高位(既符号位)为0,则最终输出为:00000000 00000000 00000000 11111111(十进制形式为 255)
    在这里插入图片描述

2.2 求解下列代码输出的结果

#include <stdio.h>

void test01()
{
	 unsigned char d = -128; 
     char e = -128;
	 printf("%d %d\n ", d, e);

}

int main()
{
    test01();
    system("pause");
    return 0;
}
  • 例: unsigned char d = -128;
  1. d在计算机存储的形式(二进制):10000000(规定)
  2. 添加bit位(因为最终输出为 %u大小为4byte, 所以添加之后bit 数量为 4*8bit),变量 d 类型为 unsigned char为无符号类型,则添加全0 -> 00000000 00000000 00000000 10000000;
  3. 解释,根据最终输出类型为%u (无符号整形)直接输出 00000000 00000000 00000000 10000000(十进制形式为 128)
  • 例: char e= -128;
  1. d在计算机存储的形式(二进制):10000000(规定)

  2. 添加bit位(因为最终输出为 %u大小为4byte, 所以添加之后bit 数量为 4*8bit),变量 d 类型为 char为有符号类型,则添加全1 -> 11111111 11111111 11111111 10000000;

  3. 解释,根据最终输出类型为%u (无符号整形)直接输出 11111111 11111111 11111111 10000000(十进制形式为 4294967168)
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值