C语言中的整型提升(Integral Promotion)
2014-02-26 19:34
609 查看
转载这篇文章是为了弄清楚下面这题
#include <iostream>
using namespace std;
int main()
{
unsigned char a = 0xA5;
unsigned char b = ~a>>4;
printf("b=%d\n", b);
return 0;
}
K&R C中关于整型提升(integral promotion)的定义为:
"A character, a short integer, or an integer bit-field, all either signed or not, or an object of enumeration type, may be used in an expression wherever an integer maybe used. If an int can represent all the values of the original
type, then the value is converted to int; otherwise the value is converted to unsigned int. This process is called integral promotion."
上面的定义归纳下来就是以下两个原则:
1). 只要一个表达式中用到了整型值,那么类型为char、short int或整型位域(这几者带符号或无符号均可)的变量,以及枚举类型的对象,都可以被放在这个整型变量的位置。
2). 如果1)中的变量的原始类型值域可以被int表示,那么原值被转换为int;否则的话,转为unsigned int。
以上两者作为一个整体,被成为整型提升(Integral promotion)
整型提升的概念容易与普通算术类型转换产生混淆。这两者的区别之一在于后者是在操作数之间类型不一致的情况下发生,最终将操作数转换为同一类型。而在算术运算这种情景下,即使操作数具有相同的类型,仍有可能发生整型提升。
例如:
char a, b, c;
c = a + b;
在上述过程中,尽管两个运算符"+"和"="的操作数全为char型,但在中间计算过程中存在着整型提升:对于表达式a+b ,a、b都是char型,因此被提升至int型后,执行“+”运算,计算结果(int型)再赋值给c(char型),又执行了隐式的类型转换。
理解了整型提升的概念后,面对下面这个C语言的FAQ,你应该不会产生困惑。
例:
char a;
printf(“sizeof(a)=%d”, sizeof(a));
输出:
原因:a不是一个表达式,a是char型,char型占1字节。
printf(“sizeof(‘A’) = %d”, sizeof(‘A’));
输出:
原因:字符‘A’是int型,不需整型提升,int型占4字节
char a, b;
printf(“sizeof(a+b)=%d”, sizeof(a+b));
输出:
原因:a+b是一个算术表达式,a、b均整型提升(int型),所以占4个字节。
char a, b, c;
printf(“sizeof(c=a+b)=%d”, sizeof(c=a+b));
输出:
原因:表达式c=a+b中,a和b是算术运算,因此整型提升(int型),计算结果(int型)再赋值给c(char型),又执行了隐式的类型转换,所以最终占1字节。
总结
1)sizeof运算符只计算常量、变量或表达式类型所占的存储空间。
2)在写这篇文章的同时,我多次和那位同事交流,发现自己对一些基本概念的理解比较模糊,不够准确,以后这方面需要加强。
转自:http://blog.sina.com.cn/s/blog_5e0fa9860100rkp5.html
#include <iostream>
using namespace std;
int main()
{
unsigned char a = 0xA5;
unsigned char b = ~a>>4;
printf("b=%d\n", b);
return 0;
}
K&R C中关于整型提升(integral promotion)的定义为:
"A character, a short integer, or an integer bit-field, all either signed or not, or an object of enumeration type, may be used in an expression wherever an integer maybe used. If an int can represent all the values of the original
type, then the value is converted to int; otherwise the value is converted to unsigned int. This process is called integral promotion."
上面的定义归纳下来就是以下两个原则:
1). 只要一个表达式中用到了整型值,那么类型为char、short int或整型位域(这几者带符号或无符号均可)的变量,以及枚举类型的对象,都可以被放在这个整型变量的位置。
2). 如果1)中的变量的原始类型值域可以被int表示,那么原值被转换为int;否则的话,转为unsigned int。
以上两者作为一个整体,被成为整型提升(Integral promotion)
整型提升的概念容易与普通算术类型转换产生混淆。这两者的区别之一在于后者是在操作数之间类型不一致的情况下发生,最终将操作数转换为同一类型。而在算术运算这种情景下,即使操作数具有相同的类型,仍有可能发生整型提升。
例如:
char a, b, c;
c = a + b;
在上述过程中,尽管两个运算符"+"和"="的操作数全为char型,但在中间计算过程中存在着整型提升:对于表达式a+b ,a、b都是char型,因此被提升至int型后,执行“+”运算,计算结果(int型)再赋值给c(char型),又执行了隐式的类型转换。
理解了整型提升的概念后,面对下面这个C语言的FAQ,你应该不会产生困惑。
例:
char a;
printf(“sizeof(a)=%d”, sizeof(a));
输出:
原因:a不是一个表达式,a是char型,char型占1字节。
printf(“sizeof(‘A’) = %d”, sizeof(‘A’));
输出:
原因:字符‘A’是int型,不需整型提升,int型占4字节
char a, b;
printf(“sizeof(a+b)=%d”, sizeof(a+b));
输出:
原因:a+b是一个算术表达式,a、b均整型提升(int型),所以占4个字节。
char a, b, c;
printf(“sizeof(c=a+b)=%d”, sizeof(c=a+b));
输出:
原因:表达式c=a+b中,a和b是算术运算,因此整型提升(int型),计算结果(int型)再赋值给c(char型),又执行了隐式的类型转换,所以最终占1字节。
总结
1)sizeof运算符只计算常量、变量或表达式类型所占的存储空间。2)在写这篇文章的同时,我多次和那位同事交流,发现自己对一些基本概念的理解比较模糊,不够准确,以后这方面需要加强。
转自:http://blog.sina.com.cn/s/blog_5e0fa9860100rkp5.html
相关文章推荐
- 关于C语言整型提升的讲解
- C语言 sizeof 整型提升 类型转换
- C语言中的整型提升(integral promotion)
- C语言中的数值类型转换:整型提升/寻常算术变化/截断/强制类型转换
- C语言进阶:整型提升
- C语言进阶:整型提升
- C语言中的整型提升(integral promotion)
- C语言中的整型提升(integral promotion)
- c语言 无符号数 结构体指针 整型提升
- C语言中的整型提升与混合类型数据的运算
- 7_24日C语言|整型提升相关介绍
- C语言中的整型提升与混合类型数据的运算
- 【C语言】整型溢出和整型提升
- 程序员面试宝典纠错,取反操作的优先级高于移位,而非移位的优先级高于取反,整型提升蒙蔽了真相
- C语言的整型数据的溢出
- C语言的三种整型数据类型:int、short int和long int
- 20170128C语言提升01_数据本质和static和生命周期和作用域
- 20170128C语言提升02_结构体和union和void
- 20170131C语言提升03_条件语句
- 20170131C语言提升04_符号