整形在内存中的存储

int main(){
	char a = -1;
	signed char b = -1;
	unsigned char c = -1;
	printf("a=%d,b=%d,c=%d", a, b, c);
	system("pause");
	return 0;
}

其中a和b的输出结果应该一致的(在不标注有无符号时默认为有符号)。
char a : 1000 0001(原码),1111 1110(反码),1111 1111(补码,内存中存储的为补码)
signed char b : 1000 0001(原码),1111 1110(反码),1111 1111(补码)
unsigned char c : 1000 0001(原码),1111 1110(反码),1111 1111(补码)存储时看类型,但看得是数值本身的类型。
打印时为%d(四个字节),需发生整形提升(看原数字的类型,若为有符号类型则前补符号位,若为无符号类型,直接前补0)。
char a:1111 1111 1111 1111 1111 1111 1111 1111(反码)—》(符号位为1则为负数故转为原码)1000 0000 0000 0000 0000 0000 0000 0001:故输出为-1;
signed char b:与a相同。
unsigned char c : 0000 0000 0000 0000 0000 0000 1111 1111(反码)—》(符号位0则为正数直接输出)输出为:255
 

int main(){
	char a = -128;// 1 1000 0000    
	printf("%u\n", a);//  1111 1111 1111 1111 1111 1111  1000 0000
	system("pause");
	return 0;
}

//无符号char取值范围:0~255.有符号char取值范围-128~127(8个比特位中有一个比特位做为符号位,有效数值位只有七个比特位)特殊1000 0000代表-128
//int 取值范围 (-2^31~2^31)-1
 

int main(){
	char a = 128;//1000 0000
	printf("%u\n", a);//1111 1111 1111 1111 1111 1111 1000 0000
	printf("%d\n", a);//1000 0000 0000 0000 0000 0000 1000 0000
	system("pause");
	return 0;
}
int main(){
	int i = -20;        //1111 1111 1111 1111 1111 1111 1110 1011
	unsigned int j = 10;//0000 0000 0000 0000 0000 0000 0000 1010
	printf("%d\n", i + j); //1000 0000 0000 0000 0000 0000 0000 1010
	system("pause");
	return 0;
}
int main(){
 unsigned int i;
 for (i = 9; i >= 0; i--){
	 printf("%u\n", i);
	 Sleep(100);
 }
 system("pause");
 return 0;
}

输出结果为死循环。当减为0时由于i时无符号数,将-1二进制全1判断为正数。进入死循环。

int main(){
	unsigned char i = 0;
	for (i = 0; i <= 255; i++){
		printf("%dhello\n",i);
		Sleep(100);
	}
	system("pause");
	return 0;
}

输出结果为死循环,i的取值范围为0~255.当加到255时,256的后8比特位全0故又将a全部清0

int main(){
	char a[1000];
	int i;
	for (i = 0; i < 1000; i++){
		a[i] = -1 - i;
	}
	printf("%d", strlen(a));
	system("pause");
	return 0;
}

输出结果为255,由于数组中只能存储char类型,(-1~-128)(0~127)共255个数

猜你喜欢

转载自blog.csdn.net/qq_44370562/article/details/89491078
今日推荐