当前位置:首页 » 存储配置 » 小端存储输出后

小端存储输出后

发布时间: 2022-07-27 09:15:23

1. 大端存储和小端存储的区别

大端模式就是低位存放在高地址上。高位存放在地址上。
小端模式就是地位存放在低地址上。高位存放在高地址上。
例如,16bit宽的数0x1234在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址 0x4000 0x4001
存放内容 0x34 0x12
而在Big-endian模式CPU内存中的存放方式则为:
内存地址 0x4000 0x4001
存放内容 0x12 0x34

2. C语言问题求解

这个问题涉及到内存分布,在这里我假设你的电脑采用小端格式存储数据(小端格式存储不了解的话先网络下)。

1、首先可以列出第一个语句 struct data d = {"", -3, 769} 赋值后的内存分布,分布如下:

00 00 00 00 00 00 00 00 fd ff ff ff 01 03 00 00

从内存分布可知前8个0就是d.str,0xfffffffd代表d.arr[0] =-3,0x00000301代表d.arr[1]=769

注:默认从左往右的地址为从低到高,符合小端格式的设定

2、执行scanf("%s", d.str);//这里输入1234abcdef 语句后的内存分布如下:

31 32 33 34 61 62 63 64 65 66 00 ff 01 03 00 00

由于"1234abcdef"的长度10超过了a.str的大小8,那么后面的2字节就会被覆盖,从内存上看,从左往右的10个字节分别对应于"1234abcdef"的ascii码;那么为什么0x66('f')后面的字节为0了呢?那是因为字符串以''结尾,所以这个字节也被覆盖了。

3、执行*((char*)(&d.str)+ 13) = '';语句后内存分布如下:

31 32 33 34 61 62 63 64 65 66 00 ff 01 00 00 00

这个语句的含义是将从d.str地址开始后的第13个字节置为'’,也就是0x03->0x00;注意第13个字节的下标应该从0开始算。

4、执行*(d.arr) += *(d.arr + 1) + 3;语句

*(d.arr + 1)其实就是等于d.arr[1]的值,也就是0x00000001,也就是1,那么*(d.arr + 1) + 3就等于4;*(d.arr)其实就是a.drr[0]=0xff006665,加上4就等于0xff006669;那么经过计算后的内存分布就变为:

31 32 33 34 61 62 63 64 69 66 00 ff 01 00 00 00

5、printf("%d ", d.arr[0]);输出什么?

从上面内存分布可以看到,d.arr[0]其实就是0xff006669,其二进制可以表示为:

1111 1111 0000 0000 0110 0110 0110 1001(高位在前表示)

最高位为1,代表为负数;由于计算机存储负数是用补补码存储的,所以这里需要将补码转换成原码,也就是是补码+1再除符号位每位取反就可以了。

补码加1:1111 1111 0000 0000 0110 0110 0110 1010

除符号位取反(原码):1000 0000 1111 1111 1001 1001 1001 0101

由于最高位为1表示负数:所以上面表示 -(0000 0000 1111 1111 1001 1001 1001 0101)=-16750999

所以:这句话输出-16750999

6、执行*d.arr = 825373492;后的内存分布

将825373492用16进制可以表示为:0x31323334(高位在前);这语句其实是对d.addr[0]进行赋值,所以就会覆盖原来的0xff006669,覆盖后的内存分布为:

31 32 33 34 61 62 63 64 34 33 32 31 01 00 00 00

7、执行d.arr[1] += 0xff;后的内存分布

执行完上面所有步骤后d.arr[1] = 0x00000001; 那么执行完d.arr[1] = d.arr[1] + 0xff后就等于256,256的16进制表示为0x00000100;所以内存分布如下:

31 32 33 34 61 62 63 64 34 33 32 31 00 01 00 00

8、printf("%s ", d.str);输出

从语句d.str的含义可知是打印从d.str地址开始的内容,直到遇到''为止(与我们理解的打印d.str有一点偏差),也就是打印31 32 33 34 61 62 63 64 34 33 32 31 00;查询ascii码可知这就是字符串"1234abcd4321";所以最后打印1234abcd4321。

综上可知:程序最后输出:

-16750999

1234abcd4321

3. 关于大端小端存储和内存的使用

亲 这个问题该结了

4. 关于大端小端存储和内存的的使用

1、大端(big endian)与小端(little endian)指的是“字节序”,严格的说,并不是针对单个变量。
2、后面两问有点模糊,我想你是想说,连续的定义两个变量吧,具体的地址分配行为是取决于编译器的,不过一般来说,如果分配在栈上,比如,你在main函数里面连续定义连个,一般栈是倒增长的,即这两个变量的地址将会是又高到低。
如果静态分配、或者在堆上分配,比如你在main函数外,全局的连续的定义两个变量,则这两个变量的地址将会是又低到高。

5. 大端和小端存储法是什么两者有什么区别

小端:较高的有效字节存放在较高的的存储器地址,较低的有效字节存放在较低的存储器地址。
大端:较高的有效字节存放在较低的存储器地址,较低的有效字节存放在较高的存储器地址。
大端模式就是低位存放在高地址上。高位存放在地址上。
小端模式就是地位存放在低地址上。高位存放在高地址上。
例如,16bit宽的数0x1234在Little-endian模式CPU内存中的存放方式(假设从地址0x4000开始存放)为:
内存地址 0x4000 0x4001
存放内容 0x34 0x12
而在Big-endian模式CPU内存中的存放方式则为:
内存地址 0x4000 0x4001
存放内容 0x12 0x34

6. 求以下程序的输出结果:

@假设你的电脑是32位操作系统

先介绍两个概念,大端存储和小端存储:

小端存储:低字节存在地址低位

大端格式:高字节存在地址高位

那么这个题分两种情况,当你的电脑是小端时:

s.b = 0xa0000L,也就是地位地址存储方式是0x00 0x00 0x0a 0x00,由此可见s.c[2] = 0x0a,s.c[0] = 0x00,所以输出:10A

当你的电脑是大端时候:

s.b = 0xa0000L,也就是地位地址存储方式是0x00 0x0a 0x00 0x00,由此可见s.c[2] = 0x00,s.c[0] = 0x00,所以输出:0A

7. 大端存储和小端存储各自的优缺点是什么

没有什么优缺点.

最好输入输出流,程序一致用同一种方式,全用big endian,或 little endian. 省去byte 交换。

8. ARM中同个字用大端和小端储存时 加载出来有什么区别

存储时用大端模式 加载时按地址从低到高(默认)就会使高低位互换,但是你要是在加载时特意高到底那就没什么了。

9. 大端存储方式和小端存储方式的区别

采用大小模式对数据进行存放的主要区别在于在存放的字节顺序,大端方式将高位存放在低地址,小端方式将低位存放在高地址。采用大端方式进行数据存放符合人类的正常思维,而采用小端方式进行数据存放利于计算机处理。到目前为止,采用大端或者小端进行数据存放,其孰优孰劣也没有定论。

热点内容
浏览器打不开服务器通信怎么办 发布:2024-05-18 21:32:22 浏览:961
创建存储空间 发布:2024-05-18 21:20:57 浏览:122
sql日期和时间 发布:2024-05-18 21:16:19 浏览:143
安卓网页怎么截取 发布:2024-05-18 20:53:56 浏览:972
在配置更新的时候没电关机怎么办 发布:2024-05-18 20:36:10 浏览:928
win7访问win2000 发布:2024-05-18 20:27:41 浏览:389
青岛人社局密码多少 发布:2024-05-18 20:19:10 浏览:735
无法存储呼叫转移 发布:2024-05-18 20:18:30 浏览:128
数据库的调优 发布:2024-05-18 20:18:29 浏览:347
sqlserver注册表清理 发布:2024-05-18 20:13:14 浏览:993