原码、反码、补码转换。short、int、long类型有无符号位输出
来源:互联网 发布:淘宝快递模板 编辑:程序博客网 时间:2024/06/02 06:09
short、int、long类型有符号位输出和无符号位输出的数值问题
原码、反码、补码转换
系统:windows 32/windows 64
软件:Visual C++ 6.0
#include<stdio.h>void main(){ printf(" 类型 = 字节数\n"); printf(" sizeof(short) = %d\n",sizeof(short)); printf("sizeof(unsigned short) = %d\n",sizeof(unsigned short)); printf(" sizeof(int) = %d\n",sizeof(int)); printf(" sizeof(unsigned int) = %d\n",sizeof(unsigned int)); printf(" sizeof(long) = %d\n",sizeof(long)); printf(" sizeof(unsigned long) = %d\n",sizeof(unsigned long)); }
运行结果:
long类型为四个字节,取值范围为-2^31~2^31-1,即-2147483648~2147483647
#include<stdio.h>void main(){ long i = 2147483648; long _i = -2147483648; long maxi = 2147483649; long _maxi = -2147483649; long mini = 2147483647; long _mini = -2147483647; printf(" 数值 = 无符号八进制 有符号十进制 无符号十进制 无符号十六进制\n"); printf(" 2147483647 = %o\t %d\t %u\t %x\n",mini,mini,mini,mini); printf("-2147483647 = %o\t %d\t %u\t %x\n",_mini,_mini,_mini,_mini); printf(" 2147483648 = %o\t %d\t %u\t %x\n",i,i,i,i); printf("-2147483648 = %o\t %d\t %u\t %x\n",_i,_i,_i,_i); printf(" 2147483649 = %o\t %d\t %u\t %x\n",maxi,maxi,maxi,maxi); printf("-2147483649 = %o\t %d\t %u\t %x\n",_maxi,_maxi,_maxi,_maxi); }
运行结果:
解析:正数的原码与补码相同、负数的补码为模数减去负数的绝对值(即负数的原码取反加一【注意数据溢出】)
2147483647的二进制
原码:0111 1111 1111 1111 1111 1111 1111 1111
补码:0111 1111 1111 1111 1111 1111 1111 1111
十六进制:0x7FFF FFFF
-2147483647的二进制
原码:0111 1111 1111 1111 1111 1111 1111 1111
反码:1000 0000 0000 0000 0000 0000 0000 0000
补码:1000 0000 0000 0000 0000 0000 0000 0001
十六进制:0x8000 0001
2147483648的二进制
原码:1000 0000 0000 0000 0000 0000 0000 0000
补码:1000 0000 0000 0000 0000 0000 0000 0000
十六进制:0x8000 0000
-2147483648的二进制
原码:1000 0000 0000 0000 0000 0000 0000 0000
反码:0111 1111 1111 1111 1111 1111 1111 1111
补码:1000 0000 0000 0000 0000 0000 0000 0000
十六进制:0x8000 0000
2147483649的二进制
原码:1000 0000 0000 0000 0000 0000 0000 0001
补码:1000 0000 0000 0000 0000 0000 0000 0001
十六进制:0x8000 0001
-2147483649的二进制
原码:1000 0000 0000 0000 0000 0000 0000 0001
反码:0111 1111 1111 1111 1111 1111 1111 1110
补码:0111 1111 1111 1111 1111 1111 1111 1111
十六进制:0x7FFF FFFF
2147483647的值等于-2147483649
2147483649的值等于-2147483647
2147483648的值等于-2147483648
因为2147483648是最大值,也是最小值。2147483649相当于从-2147483648加一进入到了负数那边(即-2147483648+1)。同理,-2147483649相当于从2147483648减一进入到正数那边(即2147483648-1)
unsigned long类型为四字节,取值范围为0~2^32-1,即0~4294967295
#include<stdio.h>void main(){ unsigned long i = 4294967295; unsigned long _i = -4294967295; unsigned long maxi = 4294967296; unsigned long _maxi = -4294967296; unsigned long mini = 4294967294; unsigned long _mini = -4294967294; printf(" 数值 = 无符号八进制 有符号十进制 无符号十进制 无符号十六进制\n"); printf(" 4294967294 = %o\t %d\t %u\t %x\n",mini,mini,mini,mini); printf("-4294967294 = %o\t\t\t %d\t %u\t\t %x\n",_mini,_mini,_mini,_mini); printf(" 4294967295 = %o\t %d\t %u\t %x\n",i,i,i,i); printf("-4294967295 = %o\t\t\t %d\t %u\t\t %x\n",_i,_i,_i,_i); printf(" 4294967296 = %o\t\t\t %d\t %u\t\t %x\n",maxi,maxi,maxi,maxi); printf("-4294967296 = %o\t\t\t %d\t %u\t\t %x\n",_maxi,_maxi,_maxi,_maxi); }
运行结果:
int类型为四个字节,取值范围为-2^31~2^31-1,即-2147483648~2147483647
#include<stdio.h>void main(){ int i = 2147483648; int _i = -2147483648; int maxi = 2147483649; int _maxi = -2147483649; int mini = 2147483647; int _mini = -2147483647; printf(" 数值 = 无符号八进制 有符号十进制 无符号十进制 无符号十六进制\n"); printf(" 2147483647 = %o\t %d\t %u\t %x\n",mini,mini,mini,mini); printf("-2147483647 = %o\t %d\t %u\t %x\n",_mini,_mini,_mini,_mini); printf(" 2147483648 = %o\t %d\t %u\t %x\n",i,i,i,i); printf("-2147483648 = %o\t %d\t %u\t %x\n",_i,_i,_i,_i); printf(" 2147483649 = %o\t %d\t %u\t %x\n",maxi,maxi,maxi,maxi); printf("-2147483649 = %o\t %d\t %u\t %x\n",_maxi,_maxi,_maxi,_maxi);}
运行结果:
unsigned int类型为四字节,取值范围为0~2^32-1,即0~4294967295
#include<stdio.h>void main(){ unsigned int i = 4294967295; unsigned int _i = -4294967295; unsigned int maxi = 4294967296; unsigned int _maxi = -4294967296; unsigned int mini = 4294967294; unsigned int _mini = -4294967294; printf(" 数值 = 无符号八进制 有符号十进制 无符号十进制 无符号十六进制\n"); printf(" 4294967294 = %o\t %d\t %u\t %x\n",mini,mini,mini,mini); printf("-4294967294 = %o\t\t\t %d\t %u\t\t %x\n",_mini,_mini,_mini,_mini); printf(" 4294967295 = %o\t %d\t %u\t %x\n",i,i,i,i); printf("-4294967295 = %o\t\t\t %d\t %u\t\t %x\n",_i,_i,_i,_i); printf(" 4294967296 = %o\t\t\t %d\t %u\t\t %x\n",maxi,maxi,maxi,maxi); printf("-4294967296 = %o\t\t\t %d\t %u\t\t %x\n",_maxi,_maxi,_maxi,_maxi);}
运行结果:
short类型为两个字节,取值范围为-2^15~2^15-1,即-32768~32767
#include<stdio.h>void main(){ short i = 32768; short _i = -32768; short maxi = 32769; short _maxi = -32769; short mini = 32767; short _mini = -32767; printf(" 数值 = 无符号八进制 有符号十进制 无符号十进制 无符号十六进制\n"); printf(" 32767 = %o\t\t %d\t %u\t\t %x\n",mini,mini,mini,mini); printf("-32767 = %o\t %d\t %u\t %x\n",_mini,_mini,_mini,_mini); printf(" 32768 = %o\t %d\t %u\t %x\n",i,i,i,i); printf("-32768 = %o\t %d\t %u\t %x\n",_i,_i,_i,_i); printf(" 32769 = %o\t %d\t %u\t %x\n",maxi,maxi,maxi,maxi); printf("-32769 = %o\t\t %d\t %u\t\t %x\n",_maxi,_maxi,_maxi,_maxi);}
运行结果:
解析:
32767(-32769)的二进制
原码:0000 0000 0000 0000 0111 1111 1111 1111
补码:0000 0000 0000 0000 0111 1111 1111 1111
十六进制:0x0000 7FFF
-32767(32769)的二进制
原码:0000 0000 0000 0000 0111 1111 1111 1111
反码:1111 1111 1111 1111 1000 0000 0000 0000
补码:1111 1111 1111 1111 1000 0000 0000 0001
十六进制:0xFFFF 8001
32768的二进制
原码:0000 0000 0000 0000 1000 0000 0000 0000
补码:0000 0000 0000 0000 1000 0000 0000 0000
十六进制:0x0000 8000
-32768的二进制
原码:0000 0000 0000 0000 1000 0000 0000 0000
反码:1111 1111 1111 1111 0111 1111 1111 1111
补码:1111 1111 1111 1111 1000 0000 0000 0000
十六进制:0xFFFF 8000
unsigned short类型为两个字节,取值范围为0~2^16-1,即0~65535
#include<stdio.h>void main(){ unsigned short i = 65535; unsigned short _i = -65535; unsigned short maxi = 65536; unsigned short _maxi = -65536; unsigned short mini = 65534; unsigned short _mini = -65534; printf(" 数值 = 无符号八进制 有符号十进制 无符号十进制 无符号十六进制\n"); printf(" 65534 = \t%o\t %d\t\t %u\t %x\n",mini,mini,mini,mini); printf("-65534 = \t%o\t %d\t\t %u\t %x\n",_mini,_mini,_mini,_mini); printf(" 65535 = \t%o\t %d\t\t %u\t %x\n",i,i,i,i); printf("-65535 = \t%o\t %d\t\t %u\t %x\n",_i,_i,_i,_i); printf(" 65536 = \t%o\t %d\t\t %u\t %x\n",maxi,maxi,maxi,maxi); printf("-65536 = \t%o\t %d\t\t %u\t %x\n",_maxi,_maxi,_maxi,_maxi);}
运行结果:
- 原码、反码、补码转换。short、int、long类型有无符号位输出
- int、short、char 类型超出范围赋值,说说原码,反码,补码。
- int、short、char 类型超出范围赋值__说说原码,反码,补码
- int、short、char 类型超出范围赋值__说说原码,反码,补码
- int、short、char 类型超出范围赋值__说说原码,反码,补码
- int、short、char 类型超出范围赋值问题__原码,反码,补码
- 原码,补码,反码转换。。。。
- 类型强制转换与计算机的原码,补码,反码
- vb.net 计算8位二进制数(包括符号位)的 原码反码补码
- 原码,补码,反码与位运算
- 位运算和原码,反码,补码
- 原码,反码,补码,移码转换技巧
- 原码反码补码移码转换详解
- 理解原码,反码,补码转换
- 位移&二进制转换&原码&反码&补码
- 原码、反码、补码的转换
- 【原码 | 补码 | 反码】相互转换方法
- 原码、补码、反码之间转换详解
- 操作列表(python)
- 记一次centos7系统内核调试的傻X行为
- debian9更新163源、配置中文输入及安装网易云音乐
- WKWebView中MessageHandler的内存泄漏问题解决过程
- 总结一下
- 原码、反码、补码转换。short、int、long类型有无符号位输出
- 素数环问题(深搜)
- python实现设计模式(一、工厂模式)
- docker升级
- JNI学习二参数传递
- 一个TCP发送小数据延迟的问题
- 跟着别人学ssm+springSecurity(三)
- 写makefiles(二)
- opencv中的图像校正相关