不得不了解的整形提升问题
【摘要】 整型提升是什么当char和short等小于两个字节的类型变量运算时,会先提升为整形再进行运算 整形提升规则对于无符号数:补0对于有符号数:补符号位 题目1:int main(){ char a = -1; signed char b = -1; unsigned char c = -1; printf("a = %d,b = %d,c = %d",a,b,c); ...
整型提升是什么
当char和short等小于两个字节的类型变量运算时,会先提升为整形再进行运算
整形提升规则
对于无符号数:补0
对于有符号数:补符号位
题目1:
int main()
{
char a = -1;
signed char b = -1;
unsigned char c = -1;
printf("a = %d,b = %d,c = %d",a,b,c);
return 0;
}
解析:
%d: 以有符号整数进行打印
a,b,c都为char类型,进行运算时会发生整型提升
内存中存放的是补码,而打印使用的是原码
-1:补码:11111111 11111111 11111111 11111111
由于a,b,c为char类型,会发生截断,从低字节往高字节取8个比特位
a,b为有符号数,整型提升补符号位,即补1
c为无符号数,整形提升补0
-
先写出原码->内存中的补码
-
由于是char类型 只能存8个bit 发生截断
-
进行打印->发生整形提升,
int main()
{
//-1
//原码:10000000 00000000 00000000 00000001
//反码:11111111 11111111 11111111 11111110
//补码:11111111 11111111 11111111 11111111
//-------------------------------------------
char a = -1;
//a :1111 1111
//整形提升高位补符号位
//11111111 11111111 11111111 11111111 ->补码
//打印的是原码,所以要转化为原码
//11111111 11111111 11111111 11111111 ->对应原码的值为-1
signed char b = -1;
//b :1111 1111
//整形提升高位补符号位
//11111111 11111111 11111111 11111111 ->补码
//打印的是原码,所以要转化为原码
//11111111 11111111 11111111 11111111 ->对应原码的值为-1
unsigned char c = -1;
//c :1111 1111
//无符号类型,整形提升高位补0
//00000000 00000000 00000000 11111111 ->补码
//符号位为0,正数,原码反码补码相同
//00000000 00000000 00000000 11111111->原码->值为255
printf("a = %d,b = %d,c = %d",a,b,c);
// -1 -1 255
return 0;
}
题目2:
int main()
{
char a = -128;
printf("%u\n",a); //4294967168
return 0;
}
解析:
思路:先写出a的原码->得出补码(内存中存放的是补码)
注意:a为char类型,只能存放8位,会发生截断
int main()
{
char a = -128;
// -128
//原码:10000000 00000000 00000000 10000000
//反码:11111111 11111111 11111111 01111111
//补码:11111111 11111111 11111111 10000000
//------------------------------
//由于a为char类型,只能存放8bit,会发生截断
//a : 10000000
//有符号类型 整形提升:补符号位
//11111111 11111111 11111111 10000000 ->补码
//%u:以无符号整形打印
//所以将11111111 11111111 11111111 10000000认为是无符号整形进行打印->符号位不代表正负,对应的值很大
printf("%u\n",a); //4294967168
return 0;
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)