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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值