整形提升和大小端

整形提升:
看变量类型,如果unsigned修饰,左边补0
如果无unsigned或signed修饰,左边补符号位
unsigned无符号数永远大于等于0
数据在内存里是以补码存的,取出时,会进行原、反、补转化
正数的原、反、补一样
负数:原码->补码 先原码转为反码,再+1就是补码了(+1影响符号位)
补码->原码 先-1变为反码,再转成原码(-1影响符号位)

大小端:
注意:按照字节为单位
将数据的低权值数据放在内存的低地址处,称为小端
将数据的低权值数据放在内存的高地址处,称为大端

下面给大家一些整形提升,大小端的题,我解析很详细

int main(){
	//如何判断一个电脑是小端还是大端
	//小端就是:把数据的低权值字节数据,放在了低地址字节里面
	//大端就是:把数据的高权值字节数据,放在了低地址字节里面
	int i = 1;
	char* result = &i;
	if (*result){
		printf("小端");
	}
	else{
		printf("大端");
	}


	/*
	a,b是有符号数,输出是%d,会整形提升,a,b前面全补符号位1,所有32个1,还是-1
	c是无符号数,输出是%d,会整形提升,但是无符号数,整形提升,前面补24个0,剩下8个1,所以255
	*/
	char a = -1;
	signed char b = -1;
	unsigned char c = -1;
	printf("a=%d,b=%d,c=%d", a, b, c);	//-1,-1,255


	/*
	-128是1000 0000
	然后无符号数输出,要整形提升
	因为a类型是有符号数,整形提升,前面补1
	然后无符号输出,直接输出1111 1111 1111 1111 1111 1111 1000 0000二进制转为十进制:
	4294967168
	*/
	char a = -128;
	printf("%u\n", a);	//4294967168


	/*
	127:	0111 1111
	1:		0000 0001
	128:	1000 0000
	因为a类型是有符号数,整形提升,前面补符号位
	还是和上面一样,因为要整形提升,补符号位1
	然后无符号输出,直接输出1111 1111 1111 1111 1111 1111 1000 0000二进制转为十进制:
	4294967168
	*/
	char a = 128;
	printf("%u\n", a);	//4294967168


	/*
	按照补码的形式进行运算,最后格式化成有符号数
	*/
	int i = -20;
	unsigned int j = 10;
	printf("%d\n", i + j);


	/*
	死循环:
	i是无符号数,永远都会大于等于0
	当1等于-1,32个1,然后无符号读是4294967295,然后就死循环了...
	*/
	unsigned int i;
	for (i = 9; i >= 0; i--)
	{
		printf("%u\n", i);
	}


	/*
	strlen,遇到/0就停止,也就是遇到0,就停止,但0不包括在内
	-1 -> -128	128个数字
	127 -> 0	128个数字
	加起来为256个数字,但是0,不能算在长度里面,所有减一,长度为255
	*/
	char a[1000];
	int i;
	for (i = 0; i<1000; i++)
	{
		a[i] = -1 - i;
	}
	printf("%d", strlen(a));

	/*
	char类型取值范围:-128 -> 127
	因为无符号数,全是大于等于0的数 所以取值范围[0,255]
	当i为256时,不满足条件
	但是256为 1 0000 0000
	char只有一字节,八比特位,发生截断,i就又变为0了,所有死循环
	*/
	unsigned char i = 0;
	for (i = 0; i <= 255; i++)
	{
		printf("%d\n", i);
		printf("hello world\n");
	}
	system("pause");
}

你可能感兴趣的:(整形提升和大小端)