欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

计算机中的数之一 无符号数与有符号数

程序员文章站 2024-01-30 23:18:22
...

下一篇:计算机中的数(二)之原码、补码、反码及其转换

引言

学过C语言的,都知道 C语言中有有符号数和无符号数。用int举例子也就是
int a;是定义了一个有符号数,而unsigned int a;是定义了一个无符号数。

正文

我们按32位编译器来举例子,int变量是4个字节。也就是32位二进制数。
那么如果是无符号数,那么根据16位二进制数可以表示2^32个状态也就是
02^32-1这样的范围。(也就是04294967295)。我们编写程序看下是不是这样 的?

      #include <stdio.h>
  	#include <limits.h>
  	int main(void)
  	{
      printf("int 占%d 字节\n",sizeof(int));
      printf("unsigned int 的范围%u~%u",0, UINT_MAX);
      return 0;
  	}

计算机中的数之一 无符号数与有符号数

如果是有符号数,对于有符号数而言,符号的正负机器是无法识别的。但由于正负恰好是两种截然不同的状态,如果用0表示正,用1表示负,这样符合也被数字化了。
所以因为有符号数使用了一位二进制数来存储符号,整体的存储范围也就比无符号数缩小了一倍范围。

#include <stdio.h>
#include <limits.h>
int main(void)
{
   printf("int 占%d 字节\n",sizeof(int));
   printf(" int 的范围%d~%d",INT_MIN, INT_MAX);
   return 0;
}

计算机中的数之一 无符号数与有符号数
但可以看到负数比正数多了一位。这是和计算机存储数字的码制有关系。有四种码:原码,补码,反码,移码。这里负数多了一位和补码存储方式有关系。想要继续了解可以点击后续文章阅读。