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个数