我需要2個字節在char pcm[]
轉換爲1個字節short pcm_[]
。 This後使用C樣式轉換,起初我在C++程序中嘗試了(使用Qt):比特移位`char`與`無符號char`
#include <QCoreApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
char pcm[2] = {0xA1, 0x12};
qDebug()<<pcm[0]<<pcm[1];
short pcm_ = (pcm[1] << 8)| pcm[0];
qDebug()<<pcm_;
short pcm_2 = ((unsigned char)(pcm[1])) << 8| (unsigned char) pcm[0];
qDebug()<<pcm_2;
return a.exec();
}
我想通了,如果我在位移用unsigned char
,但不要認爲它只能明白,爲什麼這是必要的,因爲輸入是char
。
此外,我想用C++ - 風格放送,並與這一個想出了:
short pcm_3 = (static_cast<unsigned char>(pcm[1])) << 8|
static_cast<unsigned char>(pcm[0]);
qDebug()<<pcm_3;
同樣,我需要使用unsigned char
而不是char
。
所以我有2個問題:
- 是
static_cast
正確的投?在我看來,這是一個使用reinterpret_cast
的地方的例子。但是,重新解釋演員表不起作用。 - 爲什麼我必須使用
unsigned char
?
我想你應該轉換爲'unsigned short'或'unsigned int'。弗拉德來自莫斯科的答案解釋了爲什麼它也可以工作(感謝通常的算術轉換)如果投射到'unsigned char',但我覺得這個代碼相當混亂。 – 5gon12eder
@TheParamagneticCroissant在這段代碼中只有'0x12'被移動,所以他(可能是偶然)迴避了那一個 –
另外:如果你想要一個8位類型或者16位類型,你應該使用'uint8_t' /'int8_t'或者'uint16_t' /'int16_t'。除了#2:當你使用位時,你應該總是使用無符號類型,除非你真的瞭解簽名類型的怪癖。 – Hurkyl