前言
1.数据在计算机中是以二进制的形式存储的。
2.有符号存储的数字最高位是符号数,1代表负数,0代表正数。
3.字符在计算机中以ASCLL码值的形式存储。
整形家族
char
unsigned char //无符号形
signed char//有符号形
short
signed short
unsigned short
int
signed int
unsigned int
long
整数的二进制形式有源码,反码,补码,计算机中以补码的形式进行存储。//便于计算机的减法处理。
正数的补码就是他的二进制。
负数的补码是符号位不变其他位按位取反再加1。
举个例子 :int a=-10;//4个字节-32个bit位。
原码:10000000 00000000 00000000 00001010
补码:11111111 11111111 11111111 11110101
char a=-1;
signed char b=-1;
unsigned char c=-1;
printf("%d,%d,%d"a,b,c)
大家来看一看这段代码的结果是什么
答案是-1,-1,255。
首先-1是整形,在计算机中存储的是以补码形式存储,也就是32个比特位的1;
赋值给字符型后发生截断,他们3个在计算机中存储的数据都是11111111,
接着打印,会发生整形提升,在最高位负补1;正补0;无符号数补0;
1;2是111111111-111111111-11111111-11111111//计算后源码=-1
3是00000000-00000000-00000000-11111111//源码=255
所以1,2打印
但第三个数字是无符号数,打印出来就是255.
char a=-128;
printf("%u",a);
return 0;
再看看这段代码,答案是4,294,967,168
-128在计算机中存储:
11111111-11111111-11111111-1000000
赋值后发生截断:
10000000;
打印发生提升,char是有符号数整形提升补符号位;
11111111-11111111-11111111-10000000;
接着以无符号数进行打印,就是结果啦!
int main
{
unsigned int a = 9;
for (a = 9; a >= 0; a--)
{
printf("%d", a);
Sleep(100);
}
}
我们来看这段代码
结果是会陷入死循环;
因为a是一个无符号整形,没有符号位a永远>0;