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

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

引言

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

正文

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

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

计算机中的数之一 无符号数与有符号数_第1张图片

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

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

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

你可能感兴趣的:(计算机组成原理,c,C++)