当前位置 博文首页 > mcboke的博客:c语言整数在内存中的存储
??????? 整型类型有: 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,就变成了死循环。
?
?
?
?
cs