字节设置一个无符号短
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 */
我正在尝试使用 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 */