原码、反码、补码转换。short、int、long类型有无符号位输出

我不是女神ヾ 2022-06-06 05:17 207阅读 0赞

short、int、long类型有符号位输出和无符号位输出的数值问题
原码、反码、补码转换
系统:windows 32/windows 64
软件:Visual C++ 6.0

  1. #include<stdio.h>
  2. void main()
  3. {
  4. printf(" 类型 = 字节数\n");
  5. printf(" sizeof(short) = %d\n",sizeof(short));
  6. printf("sizeof(unsigned short) = %d\n",sizeof(unsigned short));
  7. printf(" sizeof(int) = %d\n",sizeof(int));
  8. printf(" sizeof(unsigned int) = %d\n",sizeof(unsigned int));
  9. printf(" sizeof(long) = %d\n",sizeof(long));
  10. printf(" sizeof(unsigned long) = %d\n",sizeof(unsigned long));
  11. }

运行结果:
这里写图片描述
long类型为四个字节,取值范围为-2^31~2^31-1,即-2147483648~2147483647

  1. #include<stdio.h>
  2. void main()
  3. {
  4. long i = 2147483648;
  5. long _i = -2147483648;
  6. long maxi = 2147483649;
  7. long _maxi = -2147483649;
  8. long mini = 2147483647;
  9. long _mini = -2147483647;
  10. printf(" 数值 = 无符号八进制 有符号十进制 无符号十进制 无符号十六进制\n");
  11. printf(" 2147483647 = %o\t %d\t %u\t %x\n",mini,mini,mini,mini);
  12. printf("-2147483647 = %o\t %d\t %u\t %x\n",_mini,_mini,_mini,_mini);
  13. printf(" 2147483648 = %o\t %d\t %u\t %x\n",i,i,i,i);
  14. printf("-2147483648 = %o\t %d\t %u\t %x\n",_i,_i,_i,_i);
  15. printf(" 2147483649 = %o\t %d\t %u\t %x\n",maxi,maxi,maxi,maxi);
  16. printf("-2147483649 = %o\t %d\t %u\t %x\n",_maxi,_maxi,_maxi,_maxi);
  17. }

运行结果:
这里写图片描述
解析:正数的原码与补码相同、负数的补码为模数减去负数的绝对值(即负数的原码取反加一【注意数据溢出】)
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

  1. #include<stdio.h>
  2. void main()
  3. {
  4. unsigned long i = 4294967295;
  5. unsigned long _i = -4294967295;
  6. unsigned long maxi = 4294967296;
  7. unsigned long _maxi = -4294967296;
  8. unsigned long mini = 4294967294;
  9. unsigned long _mini = -4294967294;
  10. printf(" 数值 = 无符号八进制 有符号十进制 无符号十进制 无符号十六进制\n");
  11. printf(" 4294967294 = %o\t %d\t %u\t %x\n",mini,mini,mini,mini);
  12. printf("-4294967294 = %o\t\t\t %d\t %u\t\t %x\n",_mini,_mini,_mini,_mini);
  13. printf(" 4294967295 = %o\t %d\t %u\t %x\n",i,i,i,i);
  14. printf("-4294967295 = %o\t\t\t %d\t %u\t\t %x\n",_i,_i,_i,_i);
  15. printf(" 4294967296 = %o\t\t\t %d\t %u\t\t %x\n",maxi,maxi,maxi,maxi);
  16. printf("-4294967296 = %o\t\t\t %d\t %u\t\t %x\n",_maxi,_maxi,_maxi,_maxi);
  17. }

运行结果:
这里写图片描述
int类型为四个字节,取值范围为-2^31~2^31-1,即-2147483648~2147483647

  1. #include<stdio.h>
  2. void main()
  3. {
  4. int i = 2147483648;
  5. int _i = -2147483648;
  6. int maxi = 2147483649;
  7. int _maxi = -2147483649;
  8. int mini = 2147483647;
  9. int _mini = -2147483647;
  10. printf(" 数值 = 无符号八进制 有符号十进制 无符号十进制 无符号十六进制\n");
  11. printf(" 2147483647 = %o\t %d\t %u\t %x\n",mini,mini,mini,mini);
  12. printf("-2147483647 = %o\t %d\t %u\t %x\n",_mini,_mini,_mini,_mini);
  13. printf(" 2147483648 = %o\t %d\t %u\t %x\n",i,i,i,i);
  14. printf("-2147483648 = %o\t %d\t %u\t %x\n",_i,_i,_i,_i);
  15. printf(" 2147483649 = %o\t %d\t %u\t %x\n",maxi,maxi,maxi,maxi);
  16. printf("-2147483649 = %o\t %d\t %u\t %x\n",_maxi,_maxi,_maxi,_maxi);
  17. }

运行结果:
这里写图片描述
unsigned int类型为四字节,取值范围为0~2^32-1,即0~4294967295

  1. #include<stdio.h>
  2. void main()
  3. {
  4. unsigned int i = 4294967295;
  5. unsigned int _i = -4294967295;
  6. unsigned int maxi = 4294967296;
  7. unsigned int _maxi = -4294967296;
  8. unsigned int mini = 4294967294;
  9. unsigned int _mini = -4294967294;
  10. printf(" 数值 = 无符号八进制 有符号十进制 无符号十进制 无符号十六进制\n");
  11. printf(" 4294967294 = %o\t %d\t %u\t %x\n",mini,mini,mini,mini);
  12. printf("-4294967294 = %o\t\t\t %d\t %u\t\t %x\n",_mini,_mini,_mini,_mini);
  13. printf(" 4294967295 = %o\t %d\t %u\t %x\n",i,i,i,i);
  14. printf("-4294967295 = %o\t\t\t %d\t %u\t\t %x\n",_i,_i,_i,_i);
  15. printf(" 4294967296 = %o\t\t\t %d\t %u\t\t %x\n",maxi,maxi,maxi,maxi);
  16. printf("-4294967296 = %o\t\t\t %d\t %u\t\t %x\n",_maxi,_maxi,_maxi,_maxi);
  17. }

运行结果:
这里写图片描述
short类型为两个字节,取值范围为-2^15~2^15-1,即-32768~32767

  1. #include<stdio.h>
  2. void main()
  3. {
  4. short i = 32768;
  5. short _i = -32768;
  6. short maxi = 32769;
  7. short _maxi = -32769;
  8. short mini = 32767;
  9. short _mini = -32767;
  10. printf(" 数值 = 无符号八进制 有符号十进制 无符号十进制 无符号十六进制\n");
  11. printf(" 32767 = %o\t\t %d\t %u\t\t %x\n",mini,mini,mini,mini);
  12. printf("-32767 = %o\t %d\t %u\t %x\n",_mini,_mini,_mini,_mini);
  13. printf(" 32768 = %o\t %d\t %u\t %x\n",i,i,i,i);
  14. printf("-32768 = %o\t %d\t %u\t %x\n",_i,_i,_i,_i);
  15. printf(" 32769 = %o\t %d\t %u\t %x\n",maxi,maxi,maxi,maxi);
  16. printf("-32769 = %o\t\t %d\t %u\t\t %x\n",_maxi,_maxi,_maxi,_maxi);
  17. }

运行结果:
这里写图片描述
解析:
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

  1. #include<stdio.h>
  2. void main()
  3. {
  4. unsigned short i = 65535;
  5. unsigned short _i = -65535;
  6. unsigned short maxi = 65536;
  7. unsigned short _maxi = -65536;
  8. unsigned short mini = 65534;
  9. unsigned short _mini = -65534;
  10. printf(" 数值 = 无符号八进制 有符号十进制 无符号十进制 无符号十六进制\n");
  11. printf(" 65534 = \t%o\t %d\t\t %u\t %x\n",mini,mini,mini,mini);
  12. printf("-65534 = \t%o\t %d\t\t %u\t %x\n",_mini,_mini,_mini,_mini);
  13. printf(" 65535 = \t%o\t %d\t\t %u\t %x\n",i,i,i,i);
  14. printf("-65535 = \t%o\t %d\t\t %u\t %x\n",_i,_i,_i,_i);
  15. printf(" 65536 = \t%o\t %d\t\t %u\t %x\n",maxi,maxi,maxi,maxi);
  16. printf("-65536 = \t%o\t %d\t\t %u\t %x\n",_maxi,_maxi,_maxi,_maxi);
  17. }

运行结果:
这里写图片描述

发表评论

表情:
评论列表 (有 0 条评论,207人围观)

还没有评论,来说两句吧...

相关阅读

    相关 反码补码

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论

    相关 反码补码

    计算机中的符号数有三种表示方法,即 [原码][Link 1]、 [反码][Link 2]和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,

    相关 反码补码

    一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带

    相关  补码 反码

    1.正数的原码,补码,反码相同,三码合一 2.符号为 0:正数 1:负数 3.负数的补码是在原码基础上除符号位,各个位取反,补码=反码+1 4.✳计算机底层都以补码

    相关 补码反码

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 一. 机器数和真值