一、整数在内存中的存储。
整型类型有: short (短整型 )、int(整型)、long(长整型)、char(字符)。
如果我们创建一个变量要在内存中开辟一段空间。空间的大小由变量的类型决定。
计算机中有符号数有三种:原码,反码,补码。三种码都是二进制码,最高位是符号位,其余是数值位。正数符号位是0,负数符号位是1
下边讲解一下三种码之间的转换:
(1)首先将一个有符号数转换成二进制数(原码)
int a=10 a的原码是:00000000 00000000 00000000 00001010;//符号位是0,,其余是数值位。
反码是: 00000000 00000000 00000000 00001010;
补码是:00000000 00000000 00000000 00001010;正数的原码反码和补码二进制数一样。
int b=-10; b的原码是:10000000 00000000 00000000 00001010;//符号位是1,其余是数值位。
反码是: 11111111 11111111 11111111 11110101; //原码变反码,符号位不变,其数值位按位取反。
补码是: 11111111 11111111 11111111 11110110; //反码变补码,符号位不变,对补码+1。
补码变原码,将补码先取反在加一,或者按照原码变补码的逆过程。
对于整型,计算机中存储的都属补码。计算机系统中数值都按补码来表示和存储。
举个例子int main()
{
char a = -1;
unsigned char b = -1;
signed char c = -1;
printf("%d\n%d\n%d\n", a, b, c);
return 0;
}
a和c都是有符号数,计算机里存储的是 11111111 但是打印时是按%d打印,会进行整型提升(会在另外一篇博客讲解),提升之后的结果为 11111111 11111111 11111111 11111111
转换成原码,变成了10000000 00000000 00000000 00000001,即为10进制为(-1)。
b是无符号数 ,计算机里存储的是 11111111,提升之后的结果为 00000000 00000000 00000000 11111111 ,
无符号数都是正数,所以原码和反码一样,转换成10进制数是255.
例子2
int main()
{
unsigned char a = -128;
printf("%d", a);
return 0;
}
C语言中规定-128的二进制码为10000000(-0);计算机里存储的是1 00000000,他是无符号数,整型提升之后变为00000000 00000000 00000001 00000000(原反补一样)
转换成10进制数为128
例子3
int main()
{
unsigned int i;
for (i = 9; i >= 0; i--)
{
printf("%u\n", i);
}
return 0;
}
变成了死循环,当i=0时,0-1为-1;-1计算机里存储的是11111111 11111111 11111111 11111111,无符号打印,10级制数又变成了2^32-1,又大于0,就变成了死循环。