每日亿题—整型在内存中存储相关习题

本文详细分析了C语言中不同类型的字符变量在存储和打印时可能出现的溢出和整型提升现象,包括有符号和无符号字符型变量的边界情况以及其在内存中的表示。通过示例程序,解释了负值、正值以及超出范围值在不同上下文下的打印结果,揭示了二进制补码在转换过程中的作用。
摘要由CSDN通过智能技术生成

1.下面程序输出值?

#include <stdio.h>
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; }

分析:

在这里插入图片描述
1.在vs2019中,a和b的类型相同,都是有符号字符型,所代表的范围是-128~127,所以打印时进行整型提升也不会改变,故a=-1,b=-1
2.c的类型是无符号字符型,所代表的范围是0~255,所以在使用时肯定会发生一些变化
🎈-1是整数在内存中占32bit位,由于整型在内存中以补码的形式保存,-1的补码是11111111 11111111 11111111 11111111,由于要存到c中去,而c只有8bit,所以会发生截断,只保留最后8位,即c中存的是11111111
🎈当c以%d(有符号整型)的进行打印时,会发生整型提升,由于c是无符号数,所以整型提升前面直接补0,即00000000 000000000 00000000 11111111,这就是补码,由于符号位是0,所以是个整数,打印后是255

2.下面程序输出值?

#include <stdio.h>
int main()
{
    char a = -128;
    printf("%u\n",a);
    return 0; 
}

分析:

在这里插入图片描述
1.char是有符号字符型,范围是-128~127,没有超过最大范围
🎈-128是整型,在内存中的补码是11111111 11111111 11111111 10000000,由于char是8个bit位,发生截断,最后在a中存的是10000000
🎈当a以%u(无符号整型)进行打印时,发生整型提升,由于a是有符号数,所以根据符号位进行提升,即11111111 11111111 11111111 10000000,当以%u进行打印时,认为它是个正数,最后输出这个值是4294967168

3.下面程序输出值?

#include <stdio.h>
int main()
{
    char a = 128;
    printf("%u\n",a);
    return 0;
}

分析:

在这里插入图片描述
🎈a是有符号字符型,表示的范围是-128~127,超过了其最大范围
🎈128是整数,补码是00000000 00000000 00000000 10000000,由于a只有8个bit位,所以要发生截断,在a中存的就是10000000
🎈当a以%u进行打印时,先发生整型提升,由于a是有符号数,所以按照符号位进行提升,即11111111 11111111 11111111 10000000,由于以无符号数进行打印,所以认为提升后的这个数是个整数,其十进制是4294967168

4.下面程序输出值?

#include <stdio.h>
int main()
{
	unsigned int i;
	for (i = 9; i >= 0; i--) 
	{
		printf("%u\n", i);
	}
	return 0;
}

分析:

🎈该程序会死循环
🎈因为i是无符号数,程序会先执行9 8 7 6 5 4 3 2 1 0,然后i=-1,-1的补码是11111111 11111111 11111111 11111111,要存到i中,而i是无符号数,所以程序认为这是个整数,即4294967295,会死循环的执行下去

5.下面程序输出值?

#include <stdio.h>

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

分析:

在这里插入图片描述
🎈首先关注strlen,是求字符串的长度,关注的是字符串中’\0’(数字0)的位置,在此之前出现多少个字符
🎈 char是有符号数,范围是-128~127
🎈-1~-128是正常存储的,当i是-129时,补码是11111111 11111111 11111111 01111111,截断后是01111111,即127
🎈当i是-255,即i+1是-256,补码是11111111 11111111 11111111 00000000,存到i中发生截断,即00000000,此时遇到0
🎈所以总的大小是-1~-128,127 ~1,共255个数
在这里插入图片描述

6.下面程序输出值?

#include <stdio.h>

unsigned char i = 0;
int main()
{
	for (i = 0; i <= 255; i++)
	{
		printf("hello world\n");
	}
	return 0;
}

分析:

🎈该题会死循环,不断执行
🎈unsigned char 的范围是0~255,范围是8个bit位,当i是256时,00000000 00000000 00000001 00000000,存到i中会发生截断,即00000000,会从0开始重新计数,死循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值