C语言赋超过范围的值

C语言赋超过范围的值,第1张

C语言赋超过范围的值

    例子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;

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5156513.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-18
下一篇 2022-11-18

发表评论

登录后才能评论

评论列表(0条)

保存