关于整型数值在计算机内部的存储

有位小朋友来问数在计算机内部的存储,之前好像理的也不是特别清,干脆就一起理一下。

int在计算机内占四个字节,一个字节八位
所以int可以用32个0~32个1这232种表示方式表示
但因为int即表示正数也表示负数,所以这232中表示方法分了一半给负数,剩下的一半既要表示整数也包括0,所以int的范围是-231~231-1
数在计算机用补码表示

正数:

#include<iostream>
#include<math.h>
using namespace std;
void print(int sum)
{
    
    
	for (int i = 31; i >= 0; i--)
		cout << ((sum >> i) & 1);
}
int main()
{
    
    
	int sum = 0;
	for (int i = 0; i < 31; i++) {
    
    
		sum = sum * 2 + 1;
		cout << sum << endl;
		print(sum);
		cout << endl;
		if (sum == pow(2, 31) - 1) 
			cout << "Yes:" << sum << "==pow(2,31)-1" << endl;
	}
	return 0;
}
1
00000000000000000000000000000001
3
00000000000000000000000000000011
7
00000000000000000000000000000111
15
00000000000000000000000000001111
31
00000000000000000000000000011111
63
00000000000000000000000000111111
127
00000000000000000000000001111111
255
00000000000000000000000011111111
511
00000000000000000000000111111111
1023
00000000000000000000001111111111
2047
00000000000000000000011111111111
4095
00000000000000000000111111111111
8191
00000000000000000001111111111111
16383
00000000000000000011111111111111
32767
00000000000000000111111111111111
65535
00000000000000001111111111111111
131071
00000000000000011111111111111111
262143
00000000000000111111111111111111
524287
00000000000001111111111111111111
1048575
00000000000011111111111111111111
2097151
00000000000111111111111111111111
4194303
00000000001111111111111111111111
8388607
00000000011111111111111111111111
16777215
00000000111111111111111111111111
33554431
00000001111111111111111111111111
67108863
00000011111111111111111111111111
134217727
00000111111111111111111111111111
268435455
00001111111111111111111111111111
536870911
00011111111111111111111111111111
1073741823
00111111111111111111111111111111
2147483647
01111111111111111111111111111111
Yes:2147483647==pow(2,31)-1

负数

#include<iostream>
#include<math.h>
using namespace std;
void print(int sum)
{
    
    
	for (int i = 31; i >= 0; i--)
		cout << ((sum >> i) & 1);
}
int main()
{
    
    
	int sum = 0;
	for (int i = 0; i < 31; i++) {
    
    
		sum = sum * 2 - 1;
		cout << sum << endl;
		print(sum);
		cout << endl;
	}
	return 0;
}

负数的补码是在源码取反基础上加1
比如-1:
原码10000000000000000000000000000001
反码11111111111111111111111111111110
补码11111111111111111111111111111111

-1
11111111111111111111111111111111
-3
11111111111111111111111111111101
-7
11111111111111111111111111111001
-15
11111111111111111111111111110001
-31
11111111111111111111111111100001
-63
11111111111111111111111111000001
-127
11111111111111111111111110000001
-255
11111111111111111111111100000001
-511
11111111111111111111111000000001
-1023
11111111111111111111110000000001
-2047
11111111111111111111100000000001
-4095
11111111111111111111000000000001
-8191
11111111111111111110000000000001
-16383
11111111111111111100000000000001
-32767
11111111111111111000000000000001
-65535
11111111111111110000000000000001
-131071
11111111111111100000000000000001
-262143
11111111111111000000000000000001
-524287
11111111111110000000000000000001
-1048575
11111111111100000000000000000001
-2097151
11111111111000000000000000000001
-4194303
11111111110000000000000000000001
-8388607
11111111100000000000000000000001
-16777215
11111111000000000000000000000001
-33554431
11111110000000000000000000000001
-67108863
11111100000000000000000000000001
-134217727
11111000000000000000000000000001
-268435455
11110000000000000000000000000001
-536870911
11100000000000000000000000000001
-1073741823
11000000000000000000000000000001
-2147483647
10000000000000000000000000000001

猜你喜欢

转载自blog.csdn.net/weixin_50816938/article/details/120316331