奏百科 手机版
当前位置: 首页 > 常识 >

无符号二进制整数是什么意思(浅析无符号整型和有符号整型)

100次浏览     发布时间:2024-10-05 10:39:36    


整型包括长整型(long),短整形(short),整型(int),字符型(char)。众所周知,char是字符类型。但其实char也是一个比较古怪的整型,长度为1字节 (默认是无符号类型)。

然后我们来解释一下有符号数无符号数,首先我们要明白有符号和无符号都是针对二进制数来讲的,并且他们都是以补码的方式在计算机中存储的。

有符号数:用最高位最符号位,‘0’代表正数,‘1’代表负数,其余位用作数字位代表数值位。

无符号数:所有位都为数值位,无正负之分,亦无符号位。

之后我们在来瞧一瞧补码^_^

正数:原码,反码,补码都相同

负数:反码为除符号位外按位取反,补码为反码+1。

好了接下来我们看一下关于无符号和有符号的一些题

1.

int main()
{
 char a = -1;
 signed char b = -1;
 unsigned char c = -1;
 printf("%d %d %d", a, b, c);//a=-1 b=-1 c=255
 system("pause");
 return 0;
}
1
2
3
4
5
6
7
8
9
10

这个题中的a和b应该比较好理解,但是c呢我们可以来算一下

1000 0001 -1的原码

1111 1110 -1的反码

1111 1111 -1的补码

当一个无符号1字节的整型%d输出时这就涉及到整型提升(即表达式中的字符和短整型操作数在使用之前被转换为普通整型(32bit))

那-1输出是个它前应加上它的符号位‘’(若在定义是为有符号数就要要加‘1’)

即输出 0000 0000 0000 0000 0000 0000 1111 1111

此时依据整型来说此数应是2^8-1=255

2.

char a = -128;
printf("%u\n", a);//1111 1111 1111 1111 1111 1111 1000 0000
1
2

我们依旧来分析一下

首先我们先要知道这个-128在内存中是怎么存储的

char类型1个字节8个比特位若表示无符号数字的话是0000 0000~1111 1111 即0~255

但如果表示有符号数的话最高比特位应是符号位即

负数:1000 0000~1111 1111 即-128~-1 (我们规定1000 0000是-128)

正数:0000 0000~0111 1111 即0~127

我们再来看上面的这个题

1000 0000 -128

1111 1111 1111 1111 1111 1111 1000 0000 整型提升之后

按无符号整型十进制输出即4294967168

3.

char a = 128;
printf("%u\n", a);
1
2

上面说道char能表示得有符号数字的范围是0~127和-128~-1

本题中显然仅靠char中的8个比特位已经不够表示128了我们可以借一位表示即

1 1000 0000 (此时最高位依旧表示符号位)

1111 1111 1111 1111 1111 1111 1000 0000(整型提升增加符号位后)

无符号整型是十进制输出依旧是4294967168

4.

int i = -20;
unsigned int j = 10;
printf("%d\n", i + j);//输出10
1
2
3

算一波!!!

1000 0000 0000 0000 0000 0000 0001 0100 -20的原码

1111 1111 1111 1111 1111 1111 1110 1011 -20的反码

1111 1111 1111 1111 1111 1111 1110 1100 -20的补码

0000 0000 0000 0000 0000 0000 0000 1010 10的补码 +

————————————————————————————

1111 1111 1111 1111 1111 1111 1111 0110 i+j的补码

1111 1111 1111 1111 1111 1111 1111 0101 i+j的反码

0000 0000 0000 0000 0000 0000 0000 1010 i+j的原码=10

5.

unsigned i;
for (i = 9; i >= 0; i--)
{
 printf("%u\n",i);
}
1
2
3
4
5

此时我们会发现程序陷入了一个停不下来的情况,那这又是为什么嘞

我们一定要清楚i是一个无符号数是不可能为负数的所以条件是一定成立的所以是一个死循环

6.

char a[1000];
int i;
for (i = 0; i < 1000; i++)
{
 a[i] = -1-i;
}
printf("%d", strlen(a));//255
1
2
3
4
5
6
7

再来看这个代码首先a是一个无符号的数组,无符号只能放入的数字范围是0~255所以在第一个数字-1(1111 1111)存入数组时数组会以为它是一个无符号数255存入,接下来-2(1111 1110)254,以此类推,在存入‘0’时strlen就找到了‘停止符’此时数组里存入了255~1,255个数字

7.

unsigned char i = 0;
for (i = 0; i <= 255; i++)
{
 printf("Hello World!\n");
}
1
2
3
4
5

这个代码依旧是一个死循环

相关文章
  • 白色的石头是什么石头(认识一种石头:白垩)

    白垩属于石灰岩的一种,呈白色至淡灰色,质地柔软,易碎,颗粒细小,由微海洋生物的方解石壳组成。微小的化石只在显微镜下才可见,但有时也含有大块化石。它常含少量的其他矿物,如海绿石、磷灰石和黏土矿物,也含少量硅石,如海绵骨针、硅藻类、散射虫骨骼以及燧石结核。大量白垩沉积岩形成于白垩纪时期(1.42亿至65 2025-05-09 14:05:46
  • 为什么家具不用铁皮柜(铁皮柜为啥不能做衣柜?)

      铁皮柜为啥不能做衣柜?  铁皮柜是非常适合做衣柜的,在办公室、车间、更衣室等我们见到最多类型的衣柜就是铁皮柜。铁皮柜价格便宜、坚固耐用、防腐防潮、关键还不含甲醛,尤其适用于对气味了敏感的人群。  那么为什么还有人会认为铁皮柜不合适做衣柜呢?小编分析原因主要有以下几项:  一、款式单一  虽然铁皮 2025-05-09 13:09:05
  • 清道夫什么鱼料都吃吗(养清道夫有什么好处?)

     清道夫是热带鱼,主食青苔、素食者。它帮我们清理了鱼缸壁,及水草上的清苔。但它把鱼缸上的青苔清理完后,它就没有食物了也就是说断粮了。养清道夫既有好处,也有缺点。养清道夫鱼的优缺点  不少养过清道夫鱼的人会发现,清道夫的嘴像吸尘器一样,把鱼粪、绿色的植物统统吸到了肚子里。那是因为它嘴里含着一个气泡,这 2025-05-08 05:56:41
  • 为什么要有连续梁(梁桥介绍)

    一、梁桥简介梁桥是我国古代最普遍、最早出现的桥梁,古时称作平桥。它的结构简单,外形平直,比较容易建造。把木头或石梁架设在沟谷河流的两岸,就成了梁桥。早在原始社会时,我国就有了独木桥和数根圆木排拼而成的木梁桥。战国时期,单跨和多跨的木、石梁桥已普遍在黄河流域及其他地区建造。1972年,在春秋战国时期齐 2025-05-08 05:32:36
  • 为什么家里不能养鸟呢(养猫了还能不能养鸟?)

    01 你的猫咪对鸟类友好吗?02 你准备好做小鸟的主人了吗?03 逐步建立友好共存关系04 相互介绍05 有点挑战性,但不是不可能你是不是总觉得自己家的宠物还不够?许多养猫家庭都会担心自己的猫会不会对一些小宠物造成生命威胁,特别是对鸟类。鸟和猫能够和谐地相处吗?01 你的猫咪对鸟类友好吗?首先,需要 2025-05-07 03:15:16