0
点赞
收藏
分享

微信扫一扫

整形在内存中存储的一些典型题目

1.第一题

整形在内存中存储的一些典型题目_反码

首先,-1是个整数,所以我们先写出它的二进制的原码、反码、补码:

原码:10000000 00000000 00000000 00000001

反码:11111111 11111111 11111111 11111110

补码:11111111 11111111 11111111 11111111

接着,我们看要把它放到 char 类型的 a 里面,把4个字节放进一个字节,要发生截断,所以将后8位放入 a 中;

char a : 11111111 ;b 和 c 也是一样,

接着我们以整型打印,要发生整形提升:整型提升是根据你自身的符号位提升,所以 a 和 b 提升成:

补码:11111111 11111111 11111111 11111111 (vs中 ,char 和signed char 本质相同)

接着再-1再取反得到原码:

原码:10000000 00000000 00000000 00000001

最后打印出来的就是-1;

对于 c 来说,没有符号位这个说法,因为是unsigned char ,所以直接补0;c 提升成:

00000000 00000000 00000000 11111111

打印整形的时候,因为最高位是0,所以原码=反码=补码,所以打印 255;

整形在内存中存储的一些典型题目_补码_02



2.第二题

整形在内存中存储的一些典型题目_整型_03

首先,看到-128是整数,所以写出它的二进制:

原码:10000000 00000000 00000000 10000000

反码:11111111 11111111 11111111 01111111

补码:11111111 11111111 11111111 10000000

再截断:10000000;要求以无符号整型的形式打印,所以要整型提升:

补码:11111111 11111111 11111111 100000000

又因为正数的原码、反码、补码都相同,所以结果就是 4294967168;

整形在内存中存储的一些典型题目_反码_04

整形在内存中存储的一些典型题目_整型_05


3.第三题

整形在内存中存储的一些典型题目_反码_06

首先我们将128的原反补码写出来(正数的原反补相同):

00000000 00000000 00000000 100000000

存到char 类型中去再截断:10000000

因为打印无符号整型,所以整型提升:

11111111 11111111 11111111 10000000

因为无符号,所以直接看作原码,得到:4294967168;

整形在内存中存储的一些典型题目_反码_07

整形在内存中存储的一些典型题目_反码_08



4.第四题

整形在内存中存储的一些典型题目_整型_09

写出 i 和 j 的原码、反码、补码:

i :         

10000000 00000000 00000000 00010100

11111111 11111111 11111111 11101011

11111111 11111111 11111111 11101100

j :

00000000 00000000 00000000 00001010

i+j:补码相加

11111111 11111111 11111111 11110110

再-1:

11111111 11111111 11111111 11110101

再取反:

10000000 00000000 00000000 00001010

也就是:-10

整形在内存中存储的一些典型题目_反码_10



5.第五题

整形在内存中存储的一些典型题目_整型_11

i 是无符号整型,可以说 i>=0 恒成立:

9:00000000 00000000 00000000 00001001

8:00000000 00000000 00000000 00001000

7:00000000 00000000 00000000 00000111

……

1:00000000 00000000 00000000 00000001

0:00000000 00000000 00000000 00000000

4294967295:11111111 11111111 11111111 11111111

4294967294:11111111 11111111 11111111 11111110

……

0:00000000 00000000 00000000 00000000

4294967295:11111111 11111111 11111111 11111111

……(死循环)

整形在内存中存储的一些典型题目_补码_12




6.第六题

整形在内存中存储的一些典型题目_补码_13

( char 属于整数类型,是可以存数字的,但是负数不会被解释成ASCII码,这里为了方便一点正数就不写ASCII码了)

i=0 ; a[0]=-1-0=-1 ; 原码:10000001

i=1 ; a[1]=-1-1=-2 ; 原码:10000010

i=2 ;a[2]=-1-2=-3; 原码:10000011

……

i=127;a[127]=-1-127=-128 ; 原码:10000000

i=128;a[128]=-1-128=127 ;  原码:01111111

i=129;a[129]=-1-129=126; 原码:01111110

……

i=253;a[253]=-1-253=2 ; 原码:00000010

i=254;a[254]=-1-254=1 ; 原码:00000001

i=255 ; a[255]=-1-255=0 ; 原码:00000000

因为字符串遇到'\0'截止,所以i=254,所以 strlen(a) =255 ;

整形在内存中存储的一些典型题目_整型_14

如果我变式:a[i]=-2-i ; 结果就是254;

因为char a[1000] 就是 -1-128127~0的循环,直到遇到'\0'结束;



7.第七题

整形在内存中存储的一些典型题目_反码_15

首先看到 i 的类型:unsigned char ; 可以知道 i 的范围在0到255之间;

再看到for循环的判断条件,发现条件恒成立 : 死循环打印hello world ;

整形在内存中存储的一些典型题目_反码_16


通过这些题目,希望大家可以更加了解数据的存储的知识点,修炼好自己的内功。

举报

相关推荐

0 条评论