(作业)输出变量存储字节的内容及每个字节对应的地址

例:有以下变量:x 为 float型,y为in型, s 为 short, 请用C语言程序实现:可输入对应的变量值,输出其在内存中存储的每个字节的内容。比如,x=-12.5, 输出对应存储4字节内容及每个字节对应的地址。


刚看题目可能有点晕,但把题目多读几遍后,即明白若变量int x=127,则先找出x由几个字节所存储,比如4,再并找到x的存储头地址,对应依次输出x所有字节所指向(存储)的内容。

······

初学者的话是不是还有点晕?没事,先直接上代码

我们以int x=127为例,在C语言中实现。

#include<stdio.h>

int main()
{
	int x;
	char *c;
	x=127;
	c=(char*)&x;
	for(int i=0;i<sizeof(x);i++)
	{
		printf("%x \t %x \n",(c+i),*(c+i));
	}
	return 0;
}


这里再多补充解释一句,如何输出对应存储4字节内容及每个字节对应的地址?先找到第一个字节的头地址,然后依次++输出相对应的地址和该字节存储的内容。

下面来对可能有疑惑的几个点一一解释

1.

c=(char*)&x;

这句话是什么意思?

先取x的首地址,然后强制转换为char指针类型。本质上还是把x的地址给c,只不过现在的类型是char而不是int。

那为什么要转换为char呢?直接用int不好吗?

这就涉及到接下来要进行的步骤了,且看。

2.

printf("%x \t %x \n",(c+i),*(c+i));

这里(c+i)输出的是地址。*(c+i)输出的是该地址所存储的数。

我们可以看到他们两个都有+号,而这里的+后代表的是,地址加后变为下一个该类型数据所存放的地址,而不是只把字节或者说地址+1。

这是因为对int来说,如果原来的地址是abc123,那么+1后则变为abc127。(原本的一个int型数据就要占4个字节即abc123,abc124,abc125,abc126)。

现在知道为什么1中要强制转换为char型了吧?因为一个char型数据占一个字节,若要依次输出每个字节的内容,当然+1后要让地址仅仅+1。如果原来的地址是abc123,对char来说,+1就真的是变成abc124。



  • 20
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 将两个字节合并成一个字,可以使用位运算符和移位操作来实现。假设两个字节分别为byte1和byte2: 1. 首先,将byte1左移8位(即将byte1的二进制表示左移8位): ``` byte1 = byte1 << 8; ``` 2. 然后,将byte2与byte1进行或运算,将byte2的二进制表示的每一位与byte1的对应位进行或运算: ``` unsigned short result = byte1 | byte2; ``` 这样,两个字节就合并成了一个字,存储在result变量中。注意,合并后的字的类型是unsigned short,因为该类型能够存储两个字节的数据。 如果要合并更多个字节,可以使用类似的方法,将每个字节依次左移相应的位数,然后进行或运算。需要根据字节的顺序和偏移量做相应的移位和或运算操作。 这样的合并操作在PLC编程中有很多应用,例如读取和处理传感器数据、控制器数据的编码和解码等等。 ### 回答2: 要将PLC的两个字节合并成一个字,可以使用位运算符和移位运算符来实现。在大多数PLC编程语言中,可以使用以下步骤来合并两个字节: 1. 声明一个变量存储合并后的字。 2. 将第一个字节移位8位(即一个字节的位数),然后与第二个字节进行位或运算。 3. 将运算结果赋值给声明的变量。 以下是一个示例程序,在Siemens S7-1200 PLC上使用SCL语言编写,演示了如何将两个字节合并成一个字: ``` PROGRAM MergeBytes VAR Byte1: BYTE; // 第一个字节 Byte2: BYTE; // 第二个字节 Result: WORD; // 合并后的字 END_VAR Byte1 := 0xFF; // 假设第一个字节为 11111111 Byte2 := 0x0A; // 假设第二个字节为 00001010 Result := (Byte1 SHL 8) OR Byte2; // 将第一个字节左移8位,然后与第二个字节进行位或运算 // 现在,Result变量存储了合并后的字,即 1111111100001010 END_PROGRAM ``` 此程序将两个字节 `0xFF` 和 `0x0A` 合并为一个字 `0xFF0A`。 ### 回答3: 将PLC中的两个字节合并成一个字的程序,可以使用位运算和移位操作完成。 首先,假设两个字节分别为byte1和byte2,并且byte1表示高字节,byte2表示低字节。 1. 创建一个16位的变量word,用来存储合并后的字。 2. 将byte1左移8位,然后与byte2进行按位或操作,将结果存入word中。 示例代码如下: ```c unsigned char byte1 = 0xAB; // 高字节 unsigned char byte2 = 0xCD; // 低字节 unsigned int word = 0; word = (byte1 << 8) | byte2; // 合并两个字节 printf("合并后的字为: 0x%X\n", word); ``` 运行以上代码,输出结果为:合并后的字为: 0xABCD。 这样,就成功将两个字节合并成一个字了。要注意的是,高字节需要左移8位,低字节不需要移位。合并后的结果word为一个16位无符号整数,可以根据需要进行后续操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值