C语言数据存储(2)
1.练习题
//问输出结果
#include <stdio.h>
int main()
{
char a= -1;
signed char b=-1;
unsigned char c=-1;
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}
解析:
数据在内存中以二进制补码方式存储,先写出其原码,再根据原码写出补码;
-1补码:11111111111111111111111111111111
char类型占1个字节,即8位二进制,末尾数出8位:11111111
现在以整形形式打印,a是char类型,需要进行整形提升。
看符号位为1,是负的,整型提升高位补充符号位:11111111111111111111111111111111
求出的是补码,还需要转为原码,补码取反+1变为原码
a:10000000000000000000000000000001,所以a打印-1
b是有符号类型,和a同理,打印出来也是-1
c是unsigned char ,无符号字节型,整型提升高位补0
c:00000000000000000000000011111111 打印255
补充:
C语言中:char是unsigned char 还是 signed char 一般没有规定,但大部分编译器是采用signed char
int 是 signed int
char是unsigned char
2.练习题
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n",a);
return 0;
}
解析:
%u是以无符号整形打印。
a的原码:10000000000000000000000010000000
补码:11111111111111111111111110000000
char类型截取8位:10000000
char是有符号char,整型提升高位补符号位:11111111111111111111111110000000
以无符号类型打印,开头1就不是符号位,就不是负数,补码为原码
打印4,294,967,168
3.练习题
#include <stdio.h>
int main()
{
char a = 128;
printf("%u\n",a);
return 0;
}
解析:
a补码:00000000000000000000000010000000
char类型截取8位:10000000
char是有符号char,整型提升高位补符号位:11111111111111111111111110000000
以无符号类型打印,开头1就不是符号位,直接打印:4294967168
4.练习题
int i= -20;
unsigned int j = 10;
printf("%d\n", i+j);
解析:
i的原码:10000000000000000000000000010100
补码: 11111111111111111111111111101100
j补码: 00000000000000000000000000001010
加起来:11111111111111111111111111110101
求原码:10000000000000000000000000001010 -10
5.练习题
unsigned int i;
for(i = 9; i >= 0; i--)
{
printf("%u\n",i);
}
解析:
i是无符号字符型,不会小于0,最多等于0,所以会死循环。
6.练习题
int main()
{
char a[1000];
int i;
for(i=0; i<1000; i++)
{
a[i] = -1-i;
}
printf("%d",strlen(a));
return 0;
}
解析:
a[0]=-1 a[1]=-2 a[2]=-3
-1 -2 -3 -4.....-127 -128 char范围从-128 ~ 127,-128再往上+1就变为127
-1 -2 -3 -4.....-127 -128 127 126 125 .... 2 1 0 -1 -2 -3...
字符串找到\0停止,128+127=255
7.练习题
#include <stdio.h>
unsigned char i = 0;
int main()
{
for(i = 0;i<=255;i++)
{
printf("hello world\n");
}
return 0;
}
解析:
unsigned char 的范围是从0-255,255之后还会回到0,所以是死循环。