截断与整形提升的浅析

截断

当我们把长整型转换成短整形时,长整型的部分数据没有空间储存,我们就迫不得已地进行截断,在截断时,计算机会把高位的数据储存下来,将多余的低位数据截断。

对低位数据和高位数据的判断我们要看大小端

  • 大端是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中。
  • 小端是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中。
    (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;
}

目前我学习深度较浅,看到一篇文章说可以从汇编层面理解,以后再说,再次做一个记录。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

marsevilspirit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值