整形提升及例题

简介: 整形提升及例题

什么是整形提升 在表达式计算时,各种整形首先要提升为int类型,如果int类型不足以表示则要提升为unsigned int类型?

什么是表达式

整形有哪些

例题:

#include <stdio.h>
int main()
{
char a= -1;//有符号char类型的a
signed char b=-1;//有符号char类型的b
unsigned char c=-1;//无符号char类型的c
printf ("a=%d , b=%d , c=%d" ,a,b,c);//以有符号整数的形式输出a,b,c
return 0;
}

分析

-1是一个整数

原码是10000000000000000000000000000001;

反码是 11111111111111111111111111111110;

补码是 11111111111111111111111111111111;

因为char类型向内存申请空间时只得到八个比特位大小的空间

因而存储进char a的是11111111

在输出时,因为a=%d是赋值表达式,a又是char类型,因此要进行整形提升。

那么如何进行整形提升呢?这就涉及到整形提升的规则了

C语言规定,有符号数进行整形提升时,高位补符号位的数字

无符号进行整形提升时,高位补0

因此此时a中存储的是11111111111111111111111111111111

要输出还需把补码转换成原码(注:C语言中存储的是补码,显示的是原码)

对补码取反+1(或者-1取反)即可得到原码10000000000000000000000000000001

因而输出的a是-1,b与a同理

接下来分析unsigned char c。

char c中存储的是11111111,进行整形提升后是00000000000000000000000011111111

由于c是无符号数,因而它的原码补码反码相同(正数也是如此)

以有符号整数形式输出的结果是255

因而最终输出的结果是a=-1,b=-1,c=255

有符号数与无符号数相加时,有符号数的符号位要参与计算

int i= -20;
unsigned  int  j = 10;
printf("%d\n", i+j);

10000000000000000000000000010100原码

11111111111111111111111111101011反码

11111111111111111111111111101100补码

00000000000000000000000000001010原码/反码/补码

11111111111111111111111111110110

10000000000000000000000000001001

10000000000000000000000000001010

目录
打赏
0
0
0
0
1
分享
相关文章
C语言之回文数的求解。回文数一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
C语言之回文数的求解。回文数一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
204 0
|
2月前
求一个整数的所有因数
【10月更文挑战第25天】求一个整数的所有因数。
26 5
|
3月前
|
【编程基础知识】2的n次幂与二进制位全为1之间的联系,为啥只差一个1
本文深入探讨了2的n次幂与二进制位全为1之间的数学联系,解释了2的n次幂减一的二进制表示为何全为1,并探讨了这一特性在HashMap中的应用。通过基础数学原理和实际代码示例,文章揭示了这一特性的实用价值,适合各水平的编程爱好者学习。
33 3
写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换(C语言)
写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换(C语言)
77 0
【C语言刷题系列】交换整数的奇数位和偶数位
【C语言刷题系列】交换整数的奇数位和偶数位
大数的加、减、乘、除、幂运算(C语言)
大数的加、减、乘、除、幂运算(C语言)
|
8月前
LeetCode题 338比特位计数,20有效的括号,415字符串相加
LeetCode题 338比特位计数,20有效的括号,415字符串相加
74 0
|
8月前
|
整形提升和算数转换
整形提升和算数转换
52 0
【剑指offer】-数值的整数次方-12/67
【剑指offer】-数值的整数次方-12/67
剑指Offer - 面试题16:数值的整数次方
剑指Offer - 面试题16:数值的整数次方
65 0