小结 简单的整形提升

#include<stdio.h>
int main()
{
	char a = -1;
	unsigned char b = -1;//b
	signed char c = -1;//a,c 等效
	printf("%d %d %d", a, b, c);
	//-1    255   -1
    return 0;
}

可以发现 a,c的输出是正常的(大多数情况下,没有加unsigned和signed时,编译器会自动加上signed ,即自动认为是有符号数)

对于无符号数的使用要注意是否超出所在类型的范围

下面是简单的无符号类型的数字范围

 

 我们会发现 对于b对于b
-1的补码是 1111 1111 1111 1111 1111  1111 1111 1111
char发生截断
得到 1111 1111 
但我们需要注意到unsigned 只有正数
%d 打印的是int类型的

得到 0000 0000 0000 0000 0000 0000 1111 1111

这个数是一个正数,原码,反码,补码都相同。所以打印出来就

得到的是char的最大数字,255啦

类似的还有一下几个例子

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

 输出的是4294967168,不了解截断和整形提升的话,看到这个数字多少有点懵。

他是怎么得来的呢?

 类似的这个代码的输出结果和上面这个案例一样

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

原理也是一样的

接下来的这个案例会输出什么呢?

#include<stdio.h>
int main()
{
	int i = -20;
	unsigned int j = 10;
	printf("%d", i+j);
	return 0;
}

看到unsigned会不会不自觉地提高警惕,嘿嘿

不过,输出结果是-10;好像和正常输出也没有什么区别哇?让我们来看一下,编译器到底做了什么吧。

其实一句话总结:计算用补码,打印用原码

 

#include<stdio.h>
#include<windows.h>
int main()
{
	unsigned int i;
	for (i = 9; i >= 0; i--)
	{
		printf("%u\n", i );
		Sleep(1000);//睡眠1s
	}		
	return 0;
}

这个代码就有意思了瑟

屏幕会出现                                        

 这里的数字是一个一个蹦出来的

好奇的小伙伴想问了

为什么会出现429496795呢?

还记得上面谈到的两个案例么,

所以这个程序的结果其实是

  死循环。。。。

写出这样的代码可不是一个令人舒服的事情

所以,小伙伴们对于无符号数的使用一定要慎重哇

接下来的这个程序可能更有助于理解截断还有范围的问题

#include<stdio.h>
#include<windows.h>
int main()
{
	char a[1000];

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

结果是255.怎么来的嘞?

这里我直接截取了监控窗口的部分片段给大家

(不停按f10的我。。。。)终于得到了这个

 

 细心的伙伴会发现a[128]打印的是127???

发生什么事了?不是在-1吗

我们会发现 二进制也哟

周而复始 可能是普遍存在的规律吧。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值