C语言中的unsigned char数组怎么转成unsigned short数组

const unsigned char gImage_23[153600] = { 0X32,0X72.......}
const unsigned short gImage_23[]={ 0x3681,0x2AF0......}
请问怎么从CHAR转成SHORT呀?是不是只要把CHAR中的两位合起来就可以了?如上面的 改成0X3272就可以了?
这是BMP转成C代码的数组。

是的改成0X3272就可以了
用左移和 按位加:
( 0x32 << 16) | 0x72
----------------------------

如果涉及 big_endian 和 little_endian 变化,则互换两个字节即可
温馨提示:内容为网友见解,仅供参考
第1个回答  2019-04-15
发生了截断,因为unsigned
char类型只有1字节,只能保存0~255的数据,而unsigned
short
有2字节。
所以这样转换之后,unsigned
short
高2位的数据就丢失了,低2位数据被保存了。(高低位是以16进制来看的)
高低位提取:
unsigned
short
a
=
0xfeba;
int
b
=
a
&
0xff00;
/*
高2位=0xfe00
*/
int
c
=
a
&
0x00ff;
/*
低2位=0x00ba
*/
问题补充:
我用的是vb6,vb2005的ushort忘记考虑了,呵呵。
这样吧,用乘除来达到提取的目的。
检查了一下,应该这样写
高2位:变量
\
(2^8)
低2位:变量
mod
(2^8)
一字节有8个bit,所以可以表示2^8个数,就是256,用16进制表示就是0xff,刚好是2位的宽度。
假设变量是0xabcd,整除2^8,得到0xab,高2位;余除2^8,得到0xcd,低2位
不知道这样回答对不对?
第2个回答  推荐于2016-09-10

1、移位相加即可,但是要注意unsigned short类型,需要转换为无符号数据,否则0xe8认为是负数(其实也可以定义时就为unsigned short)。

2、例程:

#include <stdio.h>
int main()
{
  int i, result = 0;
  unsigned short a[4] = {0x00,0x00,0x03,0xe8};//这里定义成unsigned char,那么下面就不需要强制转换了
  for (i=0; i <4; i++)
    result += (unsigned short)a[i] << ((3-i)*8);//每次都移位,数据转换为无符号
  printf("%d\n", result);
}

第3个回答  2019-01-12
1、移位相加即可,但是要注意unsigned
short类型,需要转换为无符来号数据,否则0xe8认为是负数(其实也可以定义时就为unsigned
short)。
2、例程:
#include <stdio.h>
int main()
{
int i, result = 0;
unsigned short a[4] = {0x00,0x00,0x03,0xe8};//这里定义成源unsigned char,那么下面就不需要强制zd转换了
for (i=0; i <4; i++)
result += (unsigned short)a[i] << ((3-i)*8);//每次都移位,数据转换为无符号
printf("%d\n", result);
}
第4个回答  2019-03-23
是的改成0X3272就可以了
用左移来和
按位加:
(
0x32
<<
16)
|
0x72
----------------------------
如果涉自及
big_endian

little_endian
变化,则互换zhidao两个字节即可

C语言中的unsigned char数组怎么转成unsigned short数组
如果涉及 big_endian 和 little_endian 变化,则互换两个字节即可

C语言 unsigned short 如何相互转 signed char
int main(){ char ca;unsigned char ucb;unsigned short usc;ca = 128;ucb =128;usc = ca + ucb;printf("%d\\n", usc);usc = ca + (short)ucb;printf("%d\\n", usc);usc = (unsigned char)ca + ucb;printf("%d\\n", usc);usc = ca + (char)ucb;printf("%d\\n", usc);ge...

C++ unsigned short 转为unsigned char怎么转
unsigned short 转换为 unsigned char可以这样转:unsigned short * word;int size= WideCharToMultiByte(CP_ACP,0,word,-1, NULL, 0, NULL,0);char * AsciiBuff =new char[size];WideCharToMultiByte(CP_ACP,0,word,-1,AsciiBuff,size, NULL, 0);

...unsigned short dd=5392强制转换成unsigned char的结果是16呢?_百...
发生了截断,因为unsigned char类型只有1字节,只能保存0~255的数据,而unsigned short 有2字节。所以这样转换之后,unsigned short 高2位的数据就丢失了,低2位数据被保存了。(高低位是以16进制来看的)高低位提取:unsigned short a = 0xFEBA;int b = a & 0xFF00; \/* 高2位=0xFE00 *\/ in...

C语言的一个问题,求高手解
( ((unsigned char *)&A) + 1 ) = 1; 0000 0001 short类型是两个字节的,你强转成unsigned char *类型,地址加1则,则地址增加1个字节,所以 你打印的结果应该是这两个合起来的就是 0000 0001 0000 0000,结果应该这个256吧,学C语言不要太纠结于类型什么的,你要知道你...

C语言数据类型的转换
1. 在表达式中,char 和 short 类型的值,无论有符号还是无符号,都会自动转换成 int 或者 unsigned int(如果 short 的大小和 int 一样,unsigned short 的表示范围就大于 int,在这种情况下,unsigned short 被转换成 unsigned int)。因为它们被转换成表示范围更大的类型,故而把这种转换称为“...

(unsigned short *)()的问题
本文主要讨论的是将整形数据转换为指针类型的问题。其中,memorybase是一个unsigned int类型的整数,而flash_addr是一个unsigned short类型的指针。在编程中,我们遇到的不是简单地将指针视为整数,而是将整数转换为指针的操作。T_Buffer是一个unsigned char类型的数组,其数组中的T_Buffer[1]实际上是一个...

VC程序中unsigned char型变量转unsigned int型变量时,编译生成的代码为 ...
2者的效率是差不多的,难道是图个方便?编译器为了效率,unsigned char ,unsigned short实际也分配了4个字节,做按位与运算效率应该蛮高,并且改变为1字节,或8字节对齐都没啥影响,在4字节方式下下面的代码也可以这样写 mov eax,dword[ebp-8]and eax,0ffffh mov dword ptr[ebp-18h],eax 这样写在...

keil中 c语言中的强制转换符问题
unsigned ↑ int ←—— char,short 低 ● 图中横向箭头表示必须的转换,如两个float型数参加运算,虽然它们类型相同,但仍要先转成double型再进行运算,结果亦为double型。纵向箭头表示当运算符两边的运算数为不同类型时的转换,如一个long 型数据与一个int型数据一起运算,需要先将int型数据转换为...

char转unsigned short
cout << 这 是 向 标准输出设备 输出,不是 移位运算。cout << (unsigned short)buf1 << " " << (unsigned short)buf2 << endl;输出 '1' 和 '8' 的 数值, 即 字符1 的 ASCII 编码值 和 字符8 的 ASCII 编码值,按无符号short int 型数值 (即十进制整型)。

相似回答