例子1:
char s = 128;
printf("c = %dn", s);
1000 0000(计算机物理存储)(补码转原码)
补码1000 0000转反码(最高位为1,是一个负数,减1,得反码)
反码0111 1111转原码(按位取反,得原码)
原码1000 0000(从计算机物理存储中最高位是1,这是一个负数;)
(1000 0000,表示这个负数的绝对值,所以结果是-|1000 0000|)
输出-128
例子2:
char s = 200;
printf("c = %dn", s);
1100 1000(计算机物理存储)(补码转原码)
补码1100 1000转反码(最高位为1,是一个负数,减1,得反码)
反码1100 0111反码转原码(按位取反,得原码)
原码0011 1000(计算机物理存储中最高位是1,这是一个负数;)
(0011 1000,表示这个负数的绝对值,所以结果是-|0011 1000|)
输出-56
例子3:
char s = 129;
printf("c = %dn", s);
1000 0001(计算机物理存储)(补码转原码)
1000 0001(最高位为1,是一个负数,减1,得反码)
1000 0000(反码转原码,各位取反)
0111 1111 (从计算机物理存储中最高位是1,这是一个负数;)
(0111 1111,表示这个负数的绝对值,所以结果是-|0111 1111|)
结果(-127)
例子4:
char s = 256;
printf("c = %dn", s);
1 0000 0000(若这个数被赋值给一个char型变量,那么char型变量仅能接受前8位)
(既char型变量的物理存储值为0000 0000)
0000 0000(计算机物理存储)(补码转原码)
补码0000 0000转反码(最高位为0,是一个正数,正数的反码为正数本身)
反码0000 0000转原码(正数的原码,为正数本身)
原码0000 0000(从计算机物理存储中最高位是0,这是一个正数,所表示的数为:0000 0000;)
输出0
例子5:
char s = 257;
printf("c = %dn", s);
方法一:
0001 0000 0001(若这个数被赋值给一个char型变量,那么char型变量仅能接受前8位)
(既char型变量的物理存储值为0000 0001)
补码0000 0001转反码(正数的反码是正数本身)(补码转原码)
反码0000 0001转原码(正数的原码是正数本身)
原码0000 0001(从计算机物理存储中最高位是0,这是一个正数,所表示的数为:0000 0001;)
输出1
方法二:
char s = 257;
printf("c = %dn", s);
char类型的模为:2^8=256;
257大于模,转化为:257 - 256^1 = 1;
char s = 257 转化为 char s = 1 ;
例子6:
char s = -5;
printf("s = %hhun", s);
-5
原码1000 0101(负数转反码,除符号位,其他位取反)(原转补码)
反码1111 1010(负数反码转补码,反码加1)
补码1111 1011(补码为计算机中的实际存储,若转化为unsign char = 1111 1011 = 251)
输出:251;
例子7:
short s = -32755;
printf("s = %un", s);
printf("s = %un", s);//输出为unsigned int;
short s = -32755 可转化为 int s = -32755;
unsigned int 类型的模为: 2^32=4294967296;
int s = -32755;负数所储存的物理值等同与其绝对值的补数,2^32-|-32755| = 4294934541;
既 -32755的物理储存,与4294934541的物理储存,是完全一样的;
short s = -32755转化为unsigned int s = 4294934541;
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)