栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

关于整形在内存中的存储的例题整理

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

关于整形在内存中的存储的例题整理

第一题:

#include 
int main()
{
	char a = -1;
	signed char b = -1;
	unsigned char c = -1;
	printf("a=%d,b=%d,c=%d", a, b, c);
	return 0;
}

解题思路:a和b都是有符号数,c是无符号数。-1以二进制补码序列存进去,-1的补码是全1,因为char类型占一个字节即八个比特位,所以-1以11111111二进制序列存进去。因为以%d的形式打印,所以存在整型提升,(a和b是一样的,所以这里只讨论a)a是一个有符号数,所以整型提升的时候符号位是1,给a补上二十四个1,取出来的时候符号位为1即a是一个负数,所以要把补码转成原码,所以a和b的结果就是-1。c是一个无符号数,所以整型提升的时候看自身类型给c补上二十四个0,以%d的形式解释c,c的符号位为0即c为一个正数,所以它的原码 反码 补码都是一样的,所以c的结果为255。

第二题:

#include 
int main()
{
	char a = -128;  //1000 0000
	printf("%un", a);
	return 0;
}

 解题思路:-128以1000 0000的形式存进去,因为以%u的形式打印,所以存在整型提升,符号位为1,所以补上二十四个1。取的时候因为无符号数不看符号位,不需要将补码转成原码,所以结果就为一个很大的数。

第三题:

#include 
int main()
{
	char a = 128;
	printf("%un", a);
	return 0;
}

 解题思路:和第二题思路一致。

第四题:

#include 
int main()
{
	char a = 128;
	printf("%dn", a);
	return 0;
}

 解题思路:存的时候128以1000 0000的形式存进去,因为以%d的形式打印,所以存在整型提升,a自身的类型是有符号数,所以给a补上二十四个1。以%d的形式解释,符号位为1即a是一个负数,所以要将补码转成原码,结果就为-128。

第五题:

#include 
int main()
{
	int i = -20;
	unsigned int j = 10;
	printf("%dn", i + j);
	return 0;
}

 解题思路:按照补码的形式进行运算,最后格式化成为有符号整数。-20的补码是1111……11101100,10的补码就是原码即0000……00001010,相加结果为1111……11110110,因为以%d的形式解释,符号位是1即结果是一个负数,所以要将补码转成原码,最后结果为1000……00001010即-10。

第六题:

#include 
int main()
{
	unsigned int i;
	for (i = 9; i >= 0; i--) {
		printf("%un", i);
	}
	return 0;
}

 解题思路:因为i是无符号数,所以i一定大于0,程序会出现死循环,这个死循环的特征是从9减到0,再从0变为无符号整型的最大值,然后再从最大值减到0,0又变成最大值,一直循环下去。

第七题:

#include 
unsigned char i = 0;
int main()
{
	for (i = 0; i <= 255; i++) {
		printf("hello worldn");
	}
	return 0;
}

解题思路:因为i是无符号数,i从0加到255,255加1等于256即1 0000 0000,所以会发生溢出,截断后又变成0,所以程序结果为死循环,死循环特征为从0到255,然后又从0到255,一直循环下去。

第八题:

#include 
int main()
{
	char a[1000];
	int i;
	for (i = 0; i < 1000; i++) {
		a[i] = -1 - i;
	}
	printf("%dn", strlen(a));
	return 0;
}

解题思路:char类型的取值范围为[-128,127],-1-i可以看成-1+(-i),即-1的补码与-i的补码相加,-1补码为1111 1111。

①0的补码就为0,所以-1+0=(-1),a[0]=(-1);

②-1的补码是1111 1111,所以-1+(-1)=(-2),a[1]=(-2);

③-2的补码是1111 1110,所以-1+(-2)=(-3),a[2]=(-3);

……

-127的补码是1000 0001,所以-1+(-127)=(-128),a[127]=(-128);

-128的补码为1000 0000,所以-1+(-128)=127,a[128]=127;

-129的补码为1 0111 1111,所以-1+(-129)=126,a[129]=126;

最后当a[i]=0时,strlen检测到0时,就结束循环,所以从-1到-128一共有128个数,从127到1一共有127个数,所以一共有255个数,最后结果就为255。

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/311823.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号