数据不同类型的隐式转换

1.类型转换规则

  • char:-128~127
  • unsigned char :0~255
  • 如果大的数据放到小的内存,出现数据截断,保留小数据
  • 由窄到宽:char ,short,int ,long ,float,long long ,double
  • 整数的由窄到宽: char,short,int ,long ,long long
  • 同级别无符号比有符号宽 (int 宽度< unsigned int)
  • 整数默认为int,小数默认为double
  • 1.默认由窄变宽,
  • 2.运算的类型,int

2.数据溢出

标准规定,有符号位,最高位为符号位,0+1-,请注意如果是无符号位,所有位都是数值。

int main()
{
  char a = 200; //-128~127 200->0xc8->1100 1000 有符号的符号位为1说明是负数
  //绝对值:取反+1,0011 1000 -> -56
  unsigned char b = -1;//-1->二进制全1->1111 1111 在unsigned全是数值->255
  printf("%d,%d\n",a,b);
  return 0;
}

char类型的范围是-128-127,上述代码char a = 200;超出了char类型的数据范围,200转换为二进制为1100 1000 有符号的符号位为1说明是负数,将其绝对值取反+1,得到0011 1000 \Rightarrow -56,即a中保存的数据以十进制整数输出为-56。

int main() {
	char a = -1;
	char b = 255;//超范围,二进制1111 1111->-0000 0001(符号位为1,负数,取绝对值,取反加1)->-1
	unsigned char c = -1;//二进制1111 1111->255
	unsigned char d= 255;
	printf("%d %d %d %d",a, b, c, d);
	return 0;
}

a为整型,范围-2^{31}~2^{31}-1,-1没有超出此范围,不发生类型转换。

b为char类型,范围-128~127,255超出此范围,发生类型隐式转换,

255的二进制为1111 1111,有符号的符号位为1说明是负数,将其绝对值取反+1为1000 0001,值为-1。

c、d均为无符号char类型,范围0~255,-1超出此范围,发生类型隐式转换,

-1的二进制为1111 1111,无符号位的,所有位都是数值,即c的值为255;d的值为255,未超出范围。

3.向更宽的范围对齐

int main() {
	//-1->10000000 00000000 00000000 00000001->111111111 111111111 111111111 11111111
	unsigned int a = 10;
	if (a > -1)//unsigned int>int->unsigned int>unsigned int->10>2^31(-1)
		printf("a>-1");
	else
		printf("a<-1");
	unsigned short b = 10;//00000000 00001010
	if (b > -1)//unsigned short>int->int>int->10>-1
		printf("b>-1");
	else
		printf("b<-1");
}

 上述代码中a为无符号整型,-1默认为整型,同级别无符号比有符号,所以类型转换过程如下:

-1由整型转换为无符号整型:

-1\Rightarrow10000000 00000000 00000000 00000001\Rightarrow111111111 111111111 111111111 11111111

隐式转换过程:

unsigned int>int\Rightarrowunsigned int>unsigned int\Rightarrow10>2^{32}-1,结果为假,打印a<-1。


b为无符号短整型,-1默认为整型,整型比短整型范围更宽,类型转换过程如下:

b的二进制表示:00000000 00001010

隐式转换过程:

unsigned short>int\Rightarrowint>int\Rightarrow10>-1,结果为真,打印b>-1。


更多举例

int main(){
  char a = 'a' + 1;//char + int -> int+int -> char
  printf("%c\n",a);

  int b = 'a' + 1;//char自动提升为int

  char c = 0x12;
  char d = 8;
  printf("%x\n",c<<d);//char<<int -> int <<int ->0x00000012<<8->0x00001200
 
  return 0;
}

  • 16
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值