关于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,所以无符号打印出来才会如此的大,而有符号整数打印出来是一个负数