整形提升
C的整形算术运算总是至少以缺省类型的精度来进行的,为了获得这个精度,表达式中的字符型和短整型操作数在使用之前被转换
为普通类型,这种转换称为整形提升.
比如: char a,b,c; a = b + c;
b和c的值被提升为普通整形,然后在执行加法运算. 加法运算的结果将被截短,然后再存储于a中。 这个例子的结果和使用8位运
算的结果是相同的,但是下面这个例子当中,它的结果就不再相同. 这个例子用于计算一系列字符的简单校验和:
a = (~a ^ b << 1) >> 1;
由于存在求补和左移操作,所以8位的精度是不够的. 标准要求进行完整的整形求值,所以对这类表达式的结果,不会存在歧义性.
#include<stdio.h>
int main()
{
char a = -128;
printf("%u\n",a);
return 0;
}
- signed char: -127 -> 127
- unsigned char: 0 -> 255
- signed short: -32767 -> 32767
- unsigned short: 0 -> 65535
signed int: -2147483647 -> 2147483647
例如:
char a, b, c;
c = a + b;
在上述过程中,尽管两个运算符"+"和"="的操作数全为char型,但在中间计算过程中存在着整型提升:对于表达式a+b ,a、b都是char
型,因此被提升至int型后,执行“+”运算,计算结果(int型)再赋值给c(char型),又执行了隐式的类型转换换回char.
printf(“sizeof(‘A’) = %d”, sizeof(‘A’));
char a, b;
printf(“sizeof(a+b)=%d”, sizeof(a+b));
这个答案为4
具体原因:a+b是一个算术表达式,a、b均整型提升(int型),所以占4个字节。
char a, b, c;
printf(“sizeof(c=a+b)=%d”, sizeof(c=a+b));
这个答案是1
原因:表达式c=a+b中,a和b是算术运算,因此整型提升(int型),计算结果(int型)再赋值给c(char型),又执行了隐式的类型转换,
所以最终占1字节。