整型提升在计算机中的逻辑;发生溢出的逻辑

本文解释了C语言中整型提升的机制,涉及不同类型之间的转换规则,以及如何处理负数的补码表示和溢出情况,强调了在编程时需要注意的跨平台问题。
摘要由CSDN通过智能技术生成

        这串代码结果是 -126 ,在计算机中是怎么运行的呢?

        char a = 3;

        其中3是整型,二进制在内存中为00000000 00000000 00000000 00000011赋值存到char a中发生了截断,在内存中为00000011;

        char b = 127;

        其中127是整型,二进制在内存中为00000000 00000000 00000000 01111111赋值存到char b中发生了截断,在内存中为0111 1111;

        char c = a + b;

        c = a + b = 0000 0011 + 0111 1111 = 1000 0010

printf("%d\n",c);

        %d当成有符号数整型打印,再次发生整型提升,由于首位符号位为1,计算机认为c为负数,进行负数的整型提升,负数在进行整型提升时,高位补充符号位1,c提升为

11111111 11111111 11111111 1000 0010,负数在计算机中以补码形式存储,转换为十进制需要减一后按位取反,结果为00000000 00000000 00000000 0111 1110换算为十进制为126,加上符号位为-126。


        负数在进行整型提升时:如果发现首位为1,则认为是负数,负数整型提升前面补1,对于负数存储的是补码,需要减一变为反码,再取反变为原码,原码转换为十进制数打印。

        正数在进行整型提升时高位补0

        char类型范围为-128到127(有符号)或0到255(无符号);如果相加的结果超过这个范围,会发生溢出。使用unsigned char定义无符号数。

        整型提升是C语言中的一个“编译时自动类型转换规则”。

        在C语言中,当一个算术表达式或逻辑表达式中存在不同类型的整型变量时,编译器会按照一定的规则将这些较小范围的类型自动转换成较大范围的类型,以确保计算的准确性和操作的一致性。具体来说,整型提升遵循以下规则:

        1. 提升到int类型:如果表达式中的整型变量包括`char`、`signed char`、`unsigned char`、`short int`或`signed short int`等类型,它们会首先被提升到`int`类型。
        2. 提升到unsigned int类型:如果`int`类型的取值范围不足以表示所有参与运算的数,那么这些整数会被提升到`unsigned int`类型。
        3. 表达式计算:在进行算术运算之前,所有的提升都已经完成,确保了计算是在相同类型的数值之间进行,避免了类型不匹配带来的问题。
        4. 赋值时的整型提升:在赋值语句中,如果右侧表达式的类型比左侧变量的类型小,右侧表达式的结果也会先进行整型提升,然后赋给左侧的变量。
        5. 输出结果的影响:整型提升可能会影响程序的输出结果,特别是涉及到负数的情况。
        6. 跨平台注意事项:在不同的平台上,整型的大小和表示可能不同,因此在编写可移植的代码时需要特别小心处理整型提升的问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值