字节设置一个无符号短

Byte setting an unsigned short

我正在尝试使用 memset:

单独设置无符号短变量中的字节
#include <cstring>
#include <iostream>

int main()
{
  unsigned short test2; // 2 bytes

  std::cout << "size of test2: " << sizeof(test2) << std::endl;

  memset(&test2, 0, 2); 
  memset(&test2, 0x4D, 1);                                                               
  memset(&test2+1, 0x42, 1); 

  std::cout << "value: " << test2 << std::endl;

  return 0;
}

我得到的输出是:

size of test2: 2
value: 77

77 是 0x4D。所以出于某种原因,它没有获取我试图在变量的第二个字节上设置的 0x42。这是为什么?

&test2+1 实际上会使地址前进 sizeof(test2),即 2,并将指针移到范围之外。

尝试转换为 char*:

#include <cstring>
#include <iostream>

int main()
{
  unsigned short test2; // 2 bytes

  std::cout << "size of test2: " << sizeof(test2) << std::endl;

  memset(&test2, 0, 2); 
  memset(&test2, 0x4D, 1);                                                               
  memset((char*)&test2+1, 0x42, 1); 

  std::cout << "value: " << test2 << std::endl;

  return 0;
}

表达式 &test2+1 按测试大小缩放,因此您在内存中设置 test2 之后的 unsigned short,而不是 [=14= 的最高字节].由于您引用的 unsigned short 未分配,因此您正在调用 未定义的行为

您必须将 &test2 转换为 char * 以获得 1(字节)的缩放比例:

memset((char *)&test + 1, 0x42, 1);

不使用 memset() 的另一种方法:

unsigned short setbytes(unsigned char hi, unsigned char lo)
{
    return hi << 8 | lo;
}

...    

    unsigned short test2 = setbytes(0x42, 0x4D); /* --> 0x424D */