Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么';这是一种有效的转换方式;“无符号字符”;数组到它的";无符号短“;对应方_C++_Arrays_Char_Short - Fatal编程技术网

C++ 什么';这是一种有效的转换方式;“无符号字符”;数组到它的";无符号短“;对应方

C++ 什么';这是一种有效的转换方式;“无符号字符”;数组到它的";无符号短“;对应方,c++,arrays,char,short,C++,Arrays,Char,Short,将“unsigned char”数组转换为“unsigned short”数组的有效方法是什么?我通常使用下面的代码片段来实现这一点 #define CH_LINE_PIXELS 2291 #define SCANLINE_SIZE 57301 #define CH1_INDEX 2297 #define CH2_INDEX 4592 #define CH3_INDEX 6887 #define CH4_

将“unsigned char”数组转换为“unsigned short”数组的有效方法是什么?我通常使用下面的代码片段来实现这一点

#define CH_LINE_PIXELS       2291
#define SCANLINE_SIZE        57301
#define CH1_INDEX            2297
#define CH2_INDEX            4592
#define CH3_INDEX            6887
#define CH4_INDEX            9182

unsigned char* pUChar = new unsigned char[SCANLINE_SIZE];

unsigned short *pUS1, *pUS2, *pUS3, *pUS4;
pUS1 = reinterpret_cast<unsigned short *>(&pUChar[CH1_INDEX]);
pUS2 = reinterpret_cast<unsigned short *>(&pUChar[CH2_INDEX]);
pUS3 = reinterpret_cast<unsigned short *>(&pUChar[CH3_INDEX]);
pUS4 = reinterpret_cast<unsigned short *>(&pUChar[CH4_INDEX]);

unsigned short us1, us2;

for (unsigned int i = 0; i < CH_LINE_PIXELS; i++) 
{   
    us1 = pUChar[CH1_INDEX + 2 * i];
    us2 = pUChar[CH1_INDEX + 2 * x + 1];
    pUS1[x] = us1 * 0x100 + us2;

    us1 = pUChar[CH2_INDEX + 2 * i];
    us2 = pUChar[CH2_INDEX + 2 * i + 1];
    pUS2[x] = us1 * 0x100 + us2;

    us1 = pUChar[CH3_INDEX + 2 * i];
    us2 = pUChar[CH3_INDEX + 2 * i + 1];
    pUS3[x] = us1 * 0x100 + us2;

    us1 = pUChar[CH4_INDEX + 2 * i];
    us2 = pUChar[CH4_INDEX + 2 * i + 1];
    pUS4[x] = us1 * 0x100 + us2;
}
#定义Chu线_像素2291
#定义扫描线尺寸57301
#定义CH1_索引2297
#定义CH2_索引4592
#定义CH3_索引6887
#定义CH4_索引9182
unsigned char*pUChar=新的unsigned char[SCANLINE_SIZE];
无符号短*pUS1、*pUS2、*pUS3、*pUS4;
pUS1=重新解释铸造(&pUChar[CH1_指数]);
pUS2=重新解释铸态(&pUChar[CH2_指数]);
pUS3=重新解释铸件(&pUChar[CH3_指数]);
pUS4=重新解释铸坯(&pUChar[CH4_指数]);
无符号短us1、us2;
for(无符号整数i=0;i
字节边界上的寻址
short
可能会(也可能不会)导致对齐问题,具体取决于平台


而且,乘法非常无效,为什么不使用移位呢?(有些编译器可能会优化
x*0x100
,但如果它们不优化,那么当您只需要
x时,这将是一个巨大的性能损失。首先,您应该做:


us1我看到你忘了阅读标题为“如何格式化”的巨大侧边栏。请注意,它没有说任何关于使用HTML标记的内容……特别是,它说*只需选择所有代码并按
{}
按钮。请以后再这样做。注意,以这种方式使用
重新解释\u cast
取决于实现:也就是说,当在不同的编译器/平台上编译时,您不能期望您的代码以相同的方式运行。亲爱的jalf谢谢您对代码格式的提醒,我以后会这样做。亲爱的ereOn,您的建议是什么关于删除编译器/平台依赖的“强制转换”操作的评估?亲爱的littleadv,感谢您的回答。为了避免边界对齐问题,使用向量和向量替换无符号字符*和无符号短*数组是否更好、更安全?“如果没有”-那么他们通常不会生成有效的代码,所以如果你关心性能,你需要打开优化,或者找一个更好的编译器。为什么投反对票?我写错了什么吗?@Steve-你的评论是:我只是在陈述一个事实。有时程序员可能无法更改编译器。我不认为“乘法非常无效”或“某些编译器可能会优化”这是一个非常精确的描述,所以我不认为这是事实。有一天你会发现自己手动优化乘法来改变C++代码,看到一个显著的改进,但这不是标准。我也不认为它值得一个投票。对我来说,一个转变表示了这个无聊的操作。离子和乘法一样好,或者比乘法更好。所以我会使用它,只是不是因为你给出的原因。@Steve-当你做移位时,除了移位。乘法开销之外(我分别不同意你的观点),这仅仅是代码可读性和减少bug的可能性(图像写入
x*100
而不是
x*0x100
,请稍后查找)。“移位比乘法更快”-如果你的编译器是垃圾。亲爱的Steve,在这种情况下,我会接受你的建议。谢谢你。亲爱的Matyas,谢谢你的回答。使用移位而不是乘法,不要让短指针直接指向字符数组,而是贴花一个单独的短数组。你的建议与LittledV的建议几乎相同。伟大的人认为都一样!我接受你们的建议。谢谢大家。
00000000aaaaaaaa
<< 8
aaaaaaaa00000000
+ 00000000bbbbbbbb
aaaaaaaabbbbbbbb