设置无符号短字符的字节

Byte setting an unsigned short

本文关键字:字节 字符 无符号 设置      更新时间:2023-10-16

我正在尝试使用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,而不是test2的顶部字节。由于您引用的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 */