整型提升整型提升练习题
目录
1.整型提升知识点
实例练习题1:
实例练习题2:
实例练习题3(有坑):
小心!VS2022不可直接接触,否则!没这个必要,方源面色淡然一把抓住!顷刻炼化!
1.整型提升知识点
1.什么是整型提升?
当我们在运用变量时,变量的补码不足整形的32bit位时,我们会将变量的补码提升到32bit位
整型提升需要遵循以下规则:
a. 如果是无符号数,则高位直接补0; b. 如果是有符号数,则高位全补符号位。 注意点:整型提升提升的是补码,高位全补符号位指的也是补码的符号位
例子:
负数的整型提升
char c = -1;
c 的二进制补码为1111 1111
如果以 %d 形式打印,因为%d是以十进制整数打印
所以要将c整型提升到32bit位
char为有符号的char,整型提升高位全补符号位即可
整型提升后:1111 1111 1111 1111 1111 1111 1111 1111
正数的整型提升:
char c = 1;
变量c的二进制补码为 0000 0001如果以 %d 形式打印,因为%d是以十进制整数打印
所以要将c整型提升到32bit位
char是有符号的char,符号位是0,整型提升高位全补符号位
高位补整型提升后:0000 0000 0000 0000 0000 0000 0000 0001
无符号整数的整型提升:
unsigned char c = -1;
变量 c 的二进制补码为:1111 1111
unsigned char是无符号类型
如果以 %d 形式打印,因为%d是以十进制整数打印
所以要将c整型提升到32bit位
无符号类型整型提升高位全补0
整型提升后0000 0000 0000 0000 0000 0000 1111 1111
小知识:无符号类型没有原反补概念,它们的原反补码相同
实例练习题1:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{ char a = -1; //a的原码为1000 0000 0000 0000 0000 0000 0000 0001//反码为1111 1111 1111 1111 1111 1111 1111 1110//补码为1111 1111 1111 1111 1111 1111 1111 1111//因为char是有一个字节,所以只能存放8bit,最终存放的是1111 1111(存放的是补码)signed char b = -1;//与a一样,补码存放的是1111 1111unsigned char c = -1;//存放进c的补码也是1111 1111printf("a = %d,b = %d,c = %d", a, b, c);//%d,以十进制形式打印有符号整数// //a与b都是有符号的char类型,在以整数打印时,因为补码为1111 1111,以整数打印(32bit)需要整型提升,整型提升提升的是补码//a与b的补码1111 1111,有符号类型整型提升高位全补符号位//1111 1111 1111 1111 1111 1111 1111 1111,,整型提升后的补码//反码:1000 0000 0000 0000 0000 0000 0000 0000//原码:1000 0000 0000 0000 0000 0000 0000 0001.原码为-1//所以a,b都打印-1//c的补码为1111 1111//c进行整型提升,因为c是无符号整数,所以高位全补0//整型提升后补码:0000 0000 0000 0000 0000 0000 1111 1111//注意:c是无符号整数,无符号整数没有原反补概念,它们的原反补相等//c打印255return 0;
}
实例练习题2:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{ char a = -128;//-128的原码为1000 0000 0000 0000 0000 0000 1000 0000//反码为1111 1111 1111 1111 1111 1111 0111 1111//补码为1111 1111 1111 1111 1111 1111 1000 0000//a为char类型,存放8bit位,所以a的补码为1000 0000printf("%u", a);//%u 表示以十进制形式打印无符号整数//按照无符号十进制打印,需要整型提升,整型提升的是补码//a为有符号类型,整型提升高位全补符号位//整型提升后的补码1111 1111 1111 1111 1111 1111 1000 0000//反码为1000 0000 0000 0000 0000 0000 0111 1111//原码为1000 0000 0000 0000 0000 0000 1000 0000//打印出来的是原码,以无符号类型打印,无符号类型每一位都有效,所以是2的32次方-128 == 4294967168
}
实例练习题3(有坑):
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{ char a = 128;//128的原码为0000 0000 0000 0000 0000 0000 1000 0000//正数原反补相同//a为char类型,存放8bit位,所以a的补码为1000 0000printf("%u", a);//%u 表示以无符号十进制形式打印无符号整数//按照无符号十进制打印,需要整型提升,整型提升的是补码//a为有符号类型,整型提升高位全补符号位// 注意:符号位指的是补码的符号位//整型提升后的补码1111 1111 1111 1111 1111 1111 1000 0000//反码:1000 0000 0000 0000 0000 0000 0111 1111// 原码:1000 0000 0000 0000 0000 0000 1000 0000//打印出来的是原码,以无符号类型打印,无符号类型每一位都有效,所以是2的32次方-128 == 4294967168
}
简述:整形提升后存储的原反补码,会根据printf想要打印的方式进行解读