目录
(1)
(2)
(3)
(4)
(5)
(6)
(7)
今天给大家带来的是有关于数据存储的几个题,下面正片直接开始!
(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; }
输出结果:
注意:
有符号数与无符号数甚么时候才起作用?
在使用的时候,进行格式化输出的时候,会进行整型提升,如果是无符号数,无论符号位是0还是1,一律都补0,而对于有符号数,如果符号位是1,就补1,如果符号位是0,就补0。
(2)
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n", a);
return 0;
}
输出结果:
(3)
#include <stdio.h> int main() { char a = 128; printf("%u\n", a); return 0; }
输出结果:
(4)
#include<stdio.h> int main() { int i = -20; unsigned int j = 10; printf("%d\n", i + j); }
输出结果:
虽然i+j的过程中发生了算数转换,但是不影响最后的结果,所以我们不做考虑。
(5)
#include<stdio.h> int main() { unsigned int i; for (i = 9; i >= 0; i--) { printf("%u\n", i); } }
输出结果:
后面将陷入死循环。
(6)
int main() { char a[1000]; int i; for (i = 0; i < 1000; i++) { a[i] = -1 - i; } printf("%d", strlen(a)); return 0; }
输出结果:
此时需要注意一点:有符号的11111111,这个数为原码,要想求其保存的是什么数据,就要把其转换成补码,转换为补码之后可得-1,然后依次可得10000001为-127,此时再看10000000,这个数是不需要计算的,有符号的二进制里面,只要遇到这个数就直接将其解析,因为这个数无法按照我们的减1取反的哪种方式来计算,所以直接将其解析为-128。
事实上,-128即11000 0000的补码形式(首位截断后)就是1000 0000,这也就印证了为什么计算机会直接将这个数字解析为-128。
由上面可得:
有符号的char类型所能表示的范围为-128 - 127。
无符号的char类型所能表示的范围为0 - 255。
这些数据的范围可以通过C语言跳转到相应的文档进行查看,首先先打出代码#include,右击limits.h,然后点击转到文档即可查看数据的范围。
(7)
#include <stdio.h> unsigned char i = 0; int main() { for (i = 0; i <= 255; i++) { printf("hello world\n"); } return 0; }
输出结果:
死循环的打印hello world
借用上面的结论,在unsigned char类型中,保存的数据范围永远处于0~255,所以会死循环的打印hello world。