关于c语言中的unsigned

1.无符号类型阐述

相信很多语言中都有无符号这种说法,只是有的语言中不需要在意这个而已。其实这个对于需要编码解码的开发来说这个是必需要学习的知识

先来看一个二进制数

二进制 0111 1111

十进制 127

这组数是有符号的 但是当我想要表示-127的时候

那么他的二进制就会变成

二进制 1111 1111

十进制 -127

没错他的二进制最高位就会变成1,那么它在内存中是否是这么存储的呢?其实不是当一个数为负数的时候,在内存中存储的是它的补码,

那么存储就会变成  1000 0001

下面给图解释下:

 

 

看低位8位果然为:1000 0001

2.无符号数的打印

现在来解释一下上文的-127按照无符号整数打印出来为啥会那么大

其实原因就是:本来负数存的是补码也就是很长一串那个

然后突然一下没符号了,就按正常编码打印出来了,所以就变成了42xxxxx

3.无符号数与16进制的比较

一个16进制数半个字节,那么一个int类型就是2*4个16进制数, 这也是为什么16进制数总是成双成对出现的原因了(想单也单不了啊)

但是一个无符号整数是32位,怎么比较他们呢?

如下代码:

哎嗨?竟然是相同的!所以直接比较即可!

今天的学习到此结束,下次再见

4.无符号数的系统补位

如下代码:

 无符号和有符号都打印的是97也就是ascii值;

但是!!!看以下代码

 这里打印出来的竟然是负数,为什呢?因为一张jpg图片的开头总是0xff,也就是11111111,但是系统给当成负数处理了,所以就出现了这种情况,

但是有小伙伴可能又疑惑了,一个字符是1字节,一个int是4字节,按道理来说打印出来不应该是按照上文中那样打印ascii值吗?其实不然,因为这里他的最高位是1,然后系统当成了负数处理(也就是补码)然后其他位置也全部补上了1,所以无符号打印出来才会如此的大,而有符号整数打印出来是一个负数

posted @ 2023-12-29 23:53  鬼灰也  阅读(85)  评论(0)    收藏  举报