今天在项目编程中, 遇到一个问题, u32 类型的参数, 要赋值给一个 u8 array[3], 想用 memcpy() 函数进行赋值, 由于类型大小不一致, 一时不知道怎么做, 经过查找, 得以解决. 说明如下;
项目是在内网中做, 在查找过程中用自己笔记本做了一下实验, vs2013 版本.
类似主题是 int 类型按字节打印数据, sizeof(int) 实验验证后为 4 字节, 就分别打印出这 4 个字节中的数值.
先贴上代码
- #include<iostream>
- using namespace std;
- int main()
- {
- int i = 128;
- cout <<sizeof(int) << endl;
- unsigned char* cc = (unsigned char*)&i;
- for (int j = 0; j < 4; j++)
- printf("cc: %p \t *cc: %x\n", cc + j, *(cc + j));
- system("pause");
- return 0;
- }
输出:
以上是正确代码
以下对代码做改变
unsigned char* cc = (unsigned char*)&i;
改为
- char* cc = ( char*)&i;
- // 代码如下:
- #include<iostream>
- using namespace std;
- int main()
- {
- int i = 128;
- cout << sizeof(int) << endl;
- char* cc = ( char*)&i;
- for (int j = 0; j < 4; j++)
- printf("cc: %p \t *cc: %x\n", cc + j, *(cc + j));
- system("pause");
- return 0;
输出:
输出为什么是 ffffff80 呢?
char 类型是有符号字符型变量还是无符号字符型变量, 要看编译器是怎么定义的, 不能想当然. char 变量为一个字节, 8bit,sighed char 表示的范围是 - 128~127,(-128 在内存中二进制表示为 1000 0000,127 在内存中二进制表示为 0111 1111),unsighed char 表示的范围是 0~255.
给 i 赋值 128, 十六进制 0x80, 二进制 1000 0000, 相当于是给 char 变量赋值 - 128.
printf() 函数的参数 %x 其含义为 Unsigned hexadecimal integer; 即输出一个十六进制的整型, 而在代码中,%x 对应的是 char 类型, 所以此时 printf() 函数会将 char 类型隐式转换为 int 类型.
对于 int 类型的对象, 其值为 - 128, 则其对应的内存值是 0xFFFFFF80
所以, 在 printf() 函数中, char 类型隐式转换成 int 类型后, 输出就会变成 4 字节的 0xFFFFFF80
来源: https://www.cnblogs.com/MisterXu/p/10828963.html