整形提升及例题

简介: 整形提升及例题

什么是整形提升 在表达式计算时,各种整形首先要提升为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

相关文章
|
C语言
c语言之两个数相加
c语言之两个数相加
|
C语言
写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换(C语言)
写一个宏,可以将一个整数的二进制位的奇数位和偶数位交换(C语言)
61 0
|
5月前
|
C语言
【C语言刷题系列】计算整数的二进制位中1的个数 (三种方式)
【C语言刷题系列】计算整数的二进制位中1的个数 (三种方式)
|
5月前
|
C语言
【C语言刷题系列】交换整数的奇数位和偶数位
【C语言刷题系列】交换整数的奇数位和偶数位
|
C语言
C语言每日一题之整数求二进制1的个数
C语言每日一题之整数求二进制1的个数
|
存储 算法 C语言
C语言/计算整数二进制位中的1的个数
C语言/计算整数二进制位中的1的个数
|
6月前
|
C语言
关于整型提升与截断的一道题目
关于整型提升与截断的一道题目
25 0
|
6月前
|
存储 测试技术 C语言
LeetCode | 2.两数相加(C语言版)
LeetCode | 2.两数相加(C语言版)
64 0
|
存储 人工智能 编译器
C语言之(有关%d和%u的有关内容,输出方法)(有符号和无符号在内存中的存储情况)(整形无符号数和有符号数是如何进行计算的,整形无符号数和有符号数在循环中的应用举例)
C语言之(有关%d和%u的有关内容,输出方法)(有符号和无符号在内存中的存储情况)(整形无符号数和有符号数是如何进行计算的,整形无符号数和有符号数在循环中的应用举例)
476 0
|
存储 算法 C语言
C语言数组结合位运算实战-位移与查表
C语言数组结合位运算实战-位移与查表
101 0