【整型提升——浅析】
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;
-
a在计算机存储的形式(二进制):10000001(原) ->11111110(反)->11111111(补);
-
添加bit位(因为最终输出为 %d大小为4byte, 所以添加之后bit 数量为 4*8bit),变量 a 类型为 char为有符号类型,则添加全1 -> 11111111 11111111 11111111 11111111 ;
-
解释,根据最终输出类型为%d (有符号整形),那么再看第2步结果的最高位(既符号位)为1,则最终输出为:~(11111111 11111111 11111111 11111111 - 1)-> 10000000 00000000 00000000 00000001 (十进制形式为 -1); (signed char a为有符号类型,与char a 分析一样)
- 例: unsigned char c = -1;
-
c在计算机存储的形式(二进制):10000001(原) ->11111110(反)->11111111(补);
-
添加bit位(因为最终输出为 %d大小为4byte, 所以添加之后bit 数量为 4*8bit),变量 c 类型为 unsigned char为无符号类型,则添加全0 -> 00000000 00000000 00000000 11111111;
-
解释,根据最终输出类型为%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;
- d在计算机存储的形式(二进制):10000000(规定)
- 添加bit位(因为最终输出为 %u大小为4byte, 所以添加之后bit 数量为 4*8bit),变量 d 类型为 unsigned char为无符号类型,则添加全0 -> 00000000 00000000 00000000 10000000;
- 解释,根据最终输出类型为%u (无符号整形)直接输出 00000000 00000000 00000000 10000000(十进制形式为 128)
- 例: char e= -128;
-
d在计算机存储的形式(二进制):10000000(规定)
-
添加bit位(因为最终输出为 %u大小为4byte, 所以添加之后bit 数量为 4*8bit),变量 d 类型为 char为有符号类型,则添加全1 -> 11111111 11111111 11111111 10000000;
-
解释,根据最终输出类型为%u (无符号整形)直接输出 11111111 11111111 11111111 10000000(十进制形式为 4294967168)