截断
当我们把长整型转换成短整形时,长整型的部分数据没有空间储存,我们就迫不得已地进行截断,在截断时,计算机会把高位的数据储存下来,将多余的低位数据截断。
对低位数据和高位数据的判断我们要看大小端
- 大端是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中。
- 小端是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。
(ps:而现在的计算机大多都是小端模式,所以按小端来计算即可。)
这里举一个简单例子:
#include<stdio.h>
int main(void)
{
int a = 256;//0000 0000 0000 0000 0000 0000 0001 0000 0000
char c;
c = a;//进行截断 : 0000 0000
printf("%d",c);//所以c = 0
}
整形提升的来因
整型提升是C程序设计语言中的一项规定:在表达式计算时,各种整形首先要提升为int
类型,如果int类型不足以表示则要提升为unsigned int
类型;然后执行表达式的运算。
因为CPU的通用寄存器的长度和CPU内整型运算器的操作数的字节长度一般就是int的字节长度,所以当进行小于int类型字节数的数据类型进行运算时,实际上也要先转换为CPU内整型操作数的标准长度,所以就有了整形提升。
整形提升的使用对象
如果
int
能够表示原始类型中的所有数值,那么这个数值就被转成int型,否则,它被转成unsigned int
型,所有其它类型都不会被整型提升改变。
我的理解就是比int
数据范围小的类型就被转成int型,比int
数据范围大但比unsigned int
数据范围小的类型就被转成unsigned int
型。
C语言标准中仅规定了:
char的长度 ≤ short int的长度 ≤ int的长度
这意味着short int与int有长度相等的可能。这种情形下,unsigned short就无法提升为int表示,只能提升为unsigned int。
整形提升的规则
- 对于无符号数:补0
- 对于有符号数:补符号位
举一个经典的例子:
int main()
{
//-1是int类型
//原码 10000000 00000000 00000000 00000001
//反码 11111111 11111111 11111111 11111110
//补码 11111111 11111111 11111111 11111111
char a = -1;//进行截断
//补码11111111
signed char b = -1;//进行截断
//补码11111111
unsigned char c = -1;//进行截断
//补码11111111
printf("a = %d,b = %d,c = %d",a,b,c);//整形提升
//a有符号位 整形提升为11111111 11111111 11111111 11111111
// 原码为10000000 00000000 00000000 00000001 = -1
//b有符号位 整形提升为11111111 11111111 11111111 11111111
// 原码为10000000 00000000 00000000 00000001 = -1
//c无符号位 整形提升为00000000 00000000 00000000 11111111
// 原码为00000000 00000000 00000000 11111111 = 255
return 0;
}
目前我学习深度较浅,看到一篇文章说可以从汇编层面理解,以后再说,再次做一个记录。