c语言数据存储加深练习-创新互联

原码反码补码详解

成都创新互联公司是一家专注于成都网站设计、做网站与策划设计,阳春网站建设哪家好?成都创新互联公司做网站,专注于网站建设10余年,网设计领域的专业建站公司;建站业务涵盖:阳春等地区。阳春做网站价格咨询:18982081108

整型提升详解

菜单
    • 例题1:
    • 例题2:
    • 例题3:
      • 例1 解析:
      • 例2解析:
      • 例3解析:

例题1:
//输出什么?
#includeint main()
{char a= -1;
  signed char b=-1;
  unsigned char c=-1;
  printf("a=%d,b=%d,c=%d",a,b,c);
  return 0;
}
例题2:
//输出什么
#includeint main()
{char a = -128;
  printf("%u\n",a);
  return 0;
}
例题3:
#incluudeintmain()
{int i= -20;
unsigned  int  j = 10;
printf("%d\n", i+j);
}
例1 解析:
#includeint main()
{char a = -1;//赋值运算是从右往左算,所以先写出-1的原码,在转换成补码,在发生截断,最终才存储到a当中。
	//10000000000000000000000000000001    -1的原码
	//11111111111111111111111111111110    -1的反码
	//11111111111111111111111111111111    -1的补码
	//11111111   最终char是一个字节,只能存储8个比特位,所以要发生截断,最终a的二进制如前面    
	signed char b = -1;	
	//11111111     b的最终二进制
	unsigned char c = -1;
	//0000000000000000000000000000001
	//1111111111111111111111111111110   注意:无符号数按位取反时,直接0变 1,1变0.即可,因为所有位都是数据位
	//1111111111111111111111111111111
	//11111111  c的最终二进制
	//注意,a,b,c虽然最终的二进制是一样的,但最高位的1意义不一样,a,b的最高位为符号位,c是数据位
	printf("a=%d,b=%d,c=%d", a, b, c);//%d是以有符号的整型的原码打印(它会看你整型提升后的最高位,并把它当做符号位,并且要进行原码反码补码的转换。),上述的所有char类型全部要发生整型提升
	//11111111 a的二进制
	//11111111111111111111111111111111  a整型提升后的补码
	//11111111111111111111111111111110  a的反码
	//10000000000000000000000000000001  a的原码
	//b也是这样做
	//c的二进制 11111111
	//00000000000000000000000011111111 c整型提升后的补码
    //c整型提升后最高位为0,是正数,原码反码补码相同。
	return 0;
}// 运行结果a=-1,b=-1,c=255
例2解析:
#includeint main()
{char a = -128;
  //10000000000000000000000010000000 -128的原码
  //11111111111111111111111101111111 -128的反码
  //11111111111111111111111110000000 -128的补码
  //10000000  a的二进制
  printf("%u\n",a);//%u是打印无符号十进制数
  //1111111111111111111111111000000 整型提升后a的二进制序列,(补码)
  //以%u形式打印,它会认为补码最高位的1为数据位(直接当正数处理),所以a是正数,原码反码补码相同
  return 0;
}//运行结果a=4294967168
例3解析:
#includeint main()
{int i = -20;
	//10000000000000000000000000010100     -20的原码
	//11111111111111111111111111101011       反码
	//11111111111111111111111111101100       补码
	unsigned int j = 10;
	//00000000000000000000000000001010    正数的原码反码补码相同 
	printf("%d\n", i + j);
	//11111111111111111111111111101100    i的补码
	//00000000000000000000000000001010    j的补码
	//11111111111111111111111111110110     i+j的补码
	//11111111111111111111111111110101    i+j的反码
	//10000000000000000000000000001010    i+j的原码
	//在内存中用补码计算,然后以原码的形式打印
}

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


名称栏目:c语言数据存储加深练习-创新互联
文章链接:http://myzitong.com/article/jghse.html