一、整形提升
1、整形提升的定义
首先c语言在进行算数运算时总是按整形类型来运算的,char a = 1;char b = 2; 在执行a + b时实际上时int 型的1和2在相加。这其中涉及这样一种转换,表达式中的字符(32位1字节)和短整型(32位2字节)操作数在使用之前被转化为普通整形,这种转换称为整形提升。
2、整形提升的意义
表达式的整形运算要在CPU的相应运算器件内执行,CPU内整形运算器(ALU)的操作数字节长度一般就是int型的字节长度,这也是CPU的通用寄存器的长度,因此,即使两个char类型相加,在CPU中执行时要先转化为CPU内整形操作数的标准长度。
3、怎样进行整形提升
- 对于有符号的类型
char a = 1;
此时a内存中的是以二进制0000 0001(符号位为0)存储的,如果此时要对a进行运算或者以%d形式打印,a将被提升为 00000000 00000000 00000000 00000001,在内存中用这种形式运算或者打印。
char b = -1;
b在内存中以补码形式存储为1111 1111(符号位为1),使用b运算或以%d形式打印时,会被提升为11111111 11111111 11111111 11111111;
总结:有符号数在整形提升时看符号位,是1补1是0就补0,补够一个int形的长度。
- 对于无符号数,在高位补0即可,补够一个int形的长度。
二、整形截断
1、整形截断概念
在上面整形提升中我们举了两个例子比如: char a = 1;
我的理解首先在C语言中任何直接出现的数字(比如等号右边的1)都是直接按int型处理的。int形的1怎样赋值给char类型的a呢?
这里就涉及一个整形截断的问题,整形1在内存中存储为00000000 00000000 00000000 00000001 ;整形截断是