计算机中的数之一 无符号数与有符号数
程序员文章站
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;
}
但可以看到负数比正数多了一位。这是和计算机存储数字的码制有关系。有四种码:原码,补码,反码,移码。这里负数多了一位和补码存储方式有关系。想要继续了解可以点击后续文章阅读。
上一篇: 考研清华2011复试机考第三题
下一篇: gitlab修改用户密码
推荐阅读