[转]c语言int表示范围以及移位运算符
2011-05-04 22:22
337 查看
在计算机系统中,数值一律用补码来表示(存储)。
主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补
码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
2、补码与原码的转换过程几乎是相同的。
数值的补码表示也分两种情况:
(1)正数的补码:与原码相同。
例如,+9的补码是00001001。
(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码
0000111按位取反为1111000;再加1,所以-7的补码是11111001。
已知一个数的补码,求原码的操作分两种情况:
(1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。
(2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取
反,然后再整个数加1。
例如,已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个负
数,所以该位不变,仍为“1”;其余7位1111001取反后为0000110;再加1,所以是10000111。
刚刚看到的几个小基础知识,记录一下:
在int型为32位的硬件环境中,int的表示范围是:-2的31次方 到 2的31次方减1。
原因:因为int是带符号类型,所以最高位为符号位,于是最大表示的正数是:01111111 11111111 11111111 11111111,也就是2的31次方减1。
再来看最小值,-2的31次方的原码表示为10000000 00000000 00000000 00000000,此时最高位的数字既代表符号,也代表数值。求它的补码,所得结果为10000000 00000000 00000000 00000000。同样也是最高位既代表符号又代表数值,也就是说-2的31次方的原码和补码是相同的。
接着试试-2的31次方减1,它的原码为(假设先不考虑溢出)11111111 11111111 11111111 11111111,求反加1之后为10000000 00000000 00000000 00000001,变成了-1。所以,int的表示范围是: -2的31次方 到 2的31次方减1。
然后是移位运算符:
view plaincopy to clipboardprint?
int i = 1;
i = i << 2;
这是把i左移两位,左移的规则只记住一点:丢弃符号位,0补最低位!
如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只移动了33%32=1位。
右移有两种,算术右移(带符号)>>和逻辑右移(不带符号)>>>。
算术右移:符号位不变,左边补上符号位。如: 1000 1000 >> 3 为 1111 0001
逻辑右移:符号位一起移动,左边补上0。如:1000 1000 >>> 3 为 0001 0001
最后,移位的位数不能超过数据的大小,不能小于0。
主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补
码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
2、补码与原码的转换过程几乎是相同的。
数值的补码表示也分两种情况:
(1)正数的补码:与原码相同。
例如,+9的补码是00001001。
(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。
例如,-7的补码:因为是负数,则符号位为“1”,整个为10000111;其余7位为-7的绝对值+7的原码
0000111按位取反为1111000;再加1,所以-7的补码是11111001。
已知一个数的补码,求原码的操作分两种情况:
(1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。
(2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取
反,然后再整个数加1。
例如,已知一个补码为11111001,则原码是10000111(-7):因为符号位为“1”,表示是一个负
数,所以该位不变,仍为“1”;其余7位1111001取反后为0000110;再加1,所以是10000111。
刚刚看到的几个小基础知识,记录一下:
在int型为32位的硬件环境中,int的表示范围是:-2的31次方 到 2的31次方减1。
原因:因为int是带符号类型,所以最高位为符号位,于是最大表示的正数是:01111111 11111111 11111111 11111111,也就是2的31次方减1。
再来看最小值,-2的31次方的原码表示为10000000 00000000 00000000 00000000,此时最高位的数字既代表符号,也代表数值。求它的补码,所得结果为10000000 00000000 00000000 00000000。同样也是最高位既代表符号又代表数值,也就是说-2的31次方的原码和补码是相同的。
接着试试-2的31次方减1,它的原码为(假设先不考虑溢出)11111111 11111111 11111111 11111111,求反加1之后为10000000 00000000 00000000 00000001,变成了-1。所以,int的表示范围是: -2的31次方 到 2的31次方减1。
然后是移位运算符:
view plaincopy to clipboardprint?
int i = 1;
i = i << 2;
这是把i左移两位,左移的规则只记住一点:丢弃符号位,0补最低位!
如果移动的位数超过了该类型的最大位数,那么编译器会对移动的位数取模。如对int型移动33位,实际上只移动了33%32=1位。
右移有两种,算术右移(带符号)>>和逻辑右移(不带符号)>>>。
算术右移:符号位不变,左边补上符号位。如: 1000 1000 >> 3 为 1111 0001
逻辑右移:符号位一起移动,左边补上0。如:1000 1000 >>> 3 为 0001 0001
最后,移位的位数不能超过数据的大小,不能小于0。
相关文章推荐
- 对于c语言int类型和float,以及double类型表示范围的计算
- c语言int表示范围以及移位运算符
- 什么c语言中int的表示范围是-32768~32767
- c语言中int(2byte)的表示范围是为什么是-32768~32767!
- 为什么说C语言中int的表示范围是-32768~32767?
- 为什么C语言中int的表示范围是-32768~32767
- 为什么C语言中int的表示范围是-32768~32767
- c语言中int的表示范围是-32768~32767!
- 为什么c语言中int的表示范围是-32768~32767
- C语言中int类型数的表示范围及形式
- 为什么C语言中int的表示范围是-32768~32767
- 为什么C语言中int的表示范围是-32768~32767
- c语言中计算int,float,double,char四种数据类型所能表示的数据范围
- c语言int表示范围以及移位运算符
- C/C++中各种类型int、long、double、char表示范围(最大最小值)(转)
- C/C++中各种类型int、long、double、char表示范围(最大最小值)
- int,long型表示的整数范围
- 现在的C语言编辑器里的int范围为什么是-2147483648~2147483647
- C/C++中各种类型int、long、double、char表示范围(最大最小值)
- C语言的整型溢出问题 int、long、long long取值范围 最大最小值