unsigned 和 signed 的理解
2016-07-24 16:43
281 查看
#include <stdio.h> int main(int argc, char *argv[]) { unsigned short a = -1; short b = a; printf("%d %d",a,b); return 0; } //结果:65535 -1
这是两段很简单的代码,我就以第二段代码为例。
在计算机中,负数是以补码来存储的。 转载请注明出处http://www.cnblogs.com/stonehat/archive/2011/10/14/2212141.html
C语言中常量整数 -1的补码表示为0xFFFFFFFF。截取后面16位FFFF赋值给 变量a(unsigned short)。此时 a = 0xFFFF(a没有符号位,0xFFFF转换为十进制为65535)。
a又将0xFFFF,直接赋值给short b。 此时 b = 0xFFFF(但是要注意,b是有符号的,0xFFFF转换为十进制为-1)。
执行printf("%d %d",a,b);的时候,要将 a和b的值先转换为int型:
a没有符号所以转为int型为0x0000FFFF,
b有符号转换为int型为0xFFFFFFFF。
十进制输出值 65535 -1. 转载请注明出处http://www.cnblogs.com/stonehat/archive/2011/10/14/2212141.html
#include <stdio.h> int main(int argc, char *argv[]) { unsigned int a = -1; int b = a; printf("%d %d",a,b); return 0; } //结果 -1 -1
转载请注明出处http://www.cnblogs.com/stonehat/archive/2011/10/14/2212141.html
a在内存中值为0xFFFFFFFF,b的值为0xFFFFFFFF,都已经32位,
a转换为int型的时候就是0xFFFFFFFF,所以输出-1.
其实,记住两点就行了
1.unsigned 类型转换为 signed类型的时候是直接复制到低位,高位为0.如果signed类型位数不够,只直接装载unsigned低位。
2.signed类型转换为unsigned类型的时候,也是将补码直接复制到低位,高位为符号位。如果unsigned位数不够,只直接装载signed低位。
所有的整型类型都有两种变体:signed 和 unsigned。 有时候,要求整型变量能够存储负数,有时候则不要求。
没有使用关键字unsigned生命的整型变量都被视为无符号的,这种变量可以为正,也可以为负;而unsigned整型变量只能为正
signed 和 unsigned 整型变量占用的内存空间大小相同,而signed整型变量的部分存储空间被用于存储指出该变量是为正还是为负的信息,
因此unsigned整型变量能存储的最大值为signed整型变量能够存储的最大正数的两倍
例如,如果short变量占用2字节,则unsigned short变量的取值范围是0 - 65535,而signed short变量的取值范围内一般为正数,即最大正数为32767,然后,signed short变量也能存储负数,因此其取值范围为-32768 - 32767
相关文章推荐
- UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 26269: illegal multibyte sequence
- hdu 5190(水题)
- Hadoop学习之旅一:Hello Hadoop
- Intent和PendingIntent的区别
- oracle查询排序asc/desc 多列 order by
- matlab读取/播放视频的函数
- 线程基础二--卖票问题
- 为什么匿名内部类参数必须为final类型
- anaconda+theano+keras手写字符识别新版
- Java异常处理-----自行处理
- Java异常处理-----自行处理
- TreeSet类源码解析
- 最小生成树 Prim 算法
- Android 6.0中添加C可执行程序验证硬件驱动程序
- poj 3262 Protecting the Flowers
- Spark Shell简单使用
- 使用dbghelp生成dump文件以及事后调试分析
- STM32固件库中assert_param的作用——学习笔记
- 【排序算法】——桶排序
- 嵌入式根文件系统的移植和制作详解