C语言学习:8、signed与unsigned

C语言中,如果需要用的整数大于int类型的最大值了怎么办?

我们知道int能表示的最大数是2147483647,最小的数是-2147483648,为什么?

因为字32位系统中,寄存器是32位的,寄存器中最高位表示符号位,0表示整数,1表示负数;

所以32位系统中int的最大值可以表示为0111 1111 1111 1111 1111 1111 1111 1111,这个二进制的数就是2147483647

程序示例1:

#include 

int main()
{
	int i = 2147483647;
	short s = 32767;

	printf("i = %d\n",i);
	printf("s = %d\n", s);

	i = i + 1;
	s = s + 1;

	printf("i = %d\n", i);
	printf("s = %d\n", s);
	
	return 0;
}

输出结果:

i = 2147483647
s = 32767
i = -2147483648
s = -32768

结果是不是很奇怪,最大的数加1之后怎么都有个负号了,不可能,绝对不可能。

但是事实摆在面前了,什么原因?就是因为数据在内存中是怎么存储的问题了,前面说了,数据在内存中存储,默认最高位是符号位,默认存的数据就是有符号的;还有一个原因,正整数在内存中存的是源码,负整数在内存中存的是补码。数据到头之后再加1,你的数据极性就发生了翻转。

也就是说我们写的int ,编译器默认的是signed int;

signed int的数据范围是:-2147483648 ---- 2147483647

我们也可以主动声明数据类型,unsigned int无符号整型,内存里面的32位全部是数据,没有符号位了,那数据的范围就是:0 -- 4294967295

同理也就有了unsigned short、unsigned char。

收到启发,把

程序示例1的代码修改一下,加个unsigned进去

程序示例2:

#include 

int main()
{
	unsigned int i = 2147483647; //无符号int
	unsigned short s = 32767; //无符号short

	printf("i = %d\n",i);
	printf("s = %d\n", s);
	i = i + 1;
	s = s + 1;
	printf("i = %d\n", i);
	printf("s = %d\n", s);
	
	return 0;
}

输出的结果感觉还是错的,

i = 2147483647
s = 32767
i = -2147483648
s = 32768

而且是short的数据是对的,int的数据是错的,怎么回事?

这是因为打印出了问题,我们打印的格式是%d,默认还是有符号的整型,那为什么short类型的数据是对的呢,因为short数据太小了,内存里面存数据是32位的,short类型数据还没有溢出。

程序需要进一步修改,打印数据类型改为%u,就是输出无符号整型了,

程序示例3:

#include 

int main()
{
	unsigned int i = 2147483647;
	unsigned short s = 32767;

	printf("i = %d\n",i);
	printf("s = %d\n", s);
	i = i + 1;
	s = s + 1;
	printf("i = %u\n", i); //打印数据类型是%u
	printf("s = %d\n", s);
	
	return 0;
}

输出的结果终于正常了

i = 2147483647
s = 32767
i = 2147483648
s = 32768

在单片机开发中,无符号的整型用得比较多。

你可能感兴趣的:(C语言学习笔记,c语言,学习,算法)