認清基本資料型別和Qt串列埠通訊資料型別轉換

2021-07-25 17:04:08 字數 3376 閱讀 5763

在c語言中,僅有4種基本資料型別——整型、浮點型、指標和聚合型別(如陣列和結構等),所有其他的型別都是從這4種基本型別的某種組合派生而來。

整型包括char(字元)、short(短整型)、int(整型)、long(長整型),浮點型包括float(單精度型)和double(雙精度型)。取值範圍如下:

總結:①應該有人和我一樣,很多情況下都會使用int而較少使用到char、short、uint8這些型別,我們好像不是那麼關心記憶體,而且我們的記憶體也確實很大。但是,如果到了對記憶體緊缺的環境下這樣的亂用記憶體就會遇到很多頭疼的問題了。如果是區域性變化或者是其它棧區的變數還好,會在出花括號的時候自動釋放的記憶體,但如果是自己分配的記憶體,又沒有及時的釋放掉就可能會造成記憶體不足或者記憶體洩漏導致程式崩潰。

②char型別。char ch = 1和char ch = 『1』(字元1對應的ascii碼十進位制是49) 是完全不同的結果,第乙個是1第二個是49,char其實也是整數型別並且char型別儲存的也是整數而不是字元,我們可以直接使用數字來初始化char型別資料也可以用字元初始化。但如果是非ascii編碼的系統呢?49不一定就是字元『1』,也可能是其它的字元。而使用字元來初始化char型別在任何編碼的系統中都能得到正確的字元對應的編碼值,所以盡量用字元來初始化而不要用數字。

③強制型別轉換。強制型別轉換一定要加括號,否則就變成了賦值,需要轉換的表示式也要加括號,否則很容易出錯。還有就是,如果要從大的範圍轉換成小的範圍一定要注意,比如int i = 5; char ch = (int)(i);然後拿ch去使用了,這樣可能沒有引起程式錯誤,但如果是int i = 280; char ch = (int)(i);這時的ch的值已經超出了範圍,強制轉換的時候i只會保留最後的8位從而造成了資料丟失。

c中的基本資料型別在qt中也都可以使用,只不過qt中又定義了以q開頭的資料型別,其實只是換了個寫法。qint8/quint8等於char/uchar,qint16/quint16等於shrot/ushort,qint32/quint32等於int/uint,qlonglong/qulonglong等於long/ulong,qptrdiff/quintptr根據系統的不同而是qint32或qint64,qreal預設為double除非配置了-qreal float選項則為float。

在使用串列埠通訊的時候,如果沒搞清傳輸的資料型別或者不知道該轉換成什麼資料型別來使用的話確實令人頭疼,如果是型別轉換錯誤的話也還好,編譯器會給出錯誤提示,但如果是忘記把16進製制轉換十進位制或者是強制型別轉換時資料溢位等則會造成計算的資料結果不正確,自己又不容易檢測出錯誤。

串列埠通訊時都會用到qbytearray類,qbytearray類提供了乙個位元組陣列,其實裡面放的就是乙個個字元,但對於計算機本身來說都是二進位製碼。通訊時,一般會把乙個個16進製制的資料放進qbytearray然後進行傳輸,每個位元組的最大值是255,如果是要傳輸的值大於255就要用兩個或者更多的位元組來表示乙個資料,計算時會用到移位操作,我在剛搞這個問題的時候出過幾次錯誤,歸根結底是自己基礎不過關,不過還好現在搞明白了,下面的筆記裡會有記錄。

舉例:傳送資料:

......

qbytearray data; //要傳送的資料

data[0] = uchar(0x01);

data[1] = uchar(0x22);

......

serialport->write(data);

接收資料:

......

serialport->read(data);

qbytearray data; //接收到的資料

uchar data1 = (uchar) (data.at(0));

uchar data2 = (uchar) (data.at(1));

......

以前很少用到這個東西,最近在用串列埠通訊的時候,有些資料大概是30000多,乙個位元組最大值是255兩個位元組最大值是65535,所以只能用兩個位元組表示乙個資料,計算的時候也就要用到移位操作。

移位操作是對二進位制資料進行的,不管10進製還是16進製制編譯過後都是二進位制,左移是向左移動指定位數,移出位丟棄,空餘位補零,右移則相反。在移位運算時,byte、short和char型別移位後的結果會變成int型別。

首先要確定協議定義的資料是大端模式還是小端模式,大端模式是高位元組在前低位元組在後,小端模式則相反。這裡是按大端模式來計算,兩個位元組的16進製制資料轉換為乙個10進製的資料就是將高位元組左移8位然後加上低位元組。

舉例:①有乙個兩位元組的資料:0x01ff,轉換為10進製結果應該是511。

計算過程:

0x01ff用二進位制表示是0000 0001 1111 1111

左移8位後是:0000 0000 0000 0001 0000 0000 1111 1111

數學計算是:

1*2^8 + 255(1111 1111) = 511,x左移n位就是x乘以2的n次方。
用運算符號表示的話就是:

qbytearray data; 

data.resize(2);

data[0] = uchar(0x01);

data[1] = uchar(0xff);

int result = (uchar)(a.at(0))<<8 | (uchar)(a.at(1));

這裡的|其實就是加,因為高位元組左移8位,後面補了8個0,所以按位或就把這8個0替換成了低位元組的8位資料,但是|的意義與+不同,雖然結果一樣但用|的話運算速度更快。

②有乙個uint型資料511,已經超過了uchar型的取值範圍,所以要拆分成兩個位元組的16進製制資料來傳送。這裡是無符號數的右移操作,如果是有符號數則有所差別。

計算過程:

511用二進位制表示是0000 0001 1111 1111

右移8位後是:0000 0000 0000 0000 0000 0000 0000 0001

數學計算是:

第乙個位元組等於256(0000 0001  0000 0000)/(2^8),x右移n位就是x除以2的n次方,第二個位元組等於0xff。
用運算符號表示的話就是:

uint i = 511; 

qbytearray data;

data.resize(2);

data[0] = (uchar)(i>>8);

data[1] = (uchar)(0xff);

QT基本資料型別

qint8 signed char 有符號8位元資料 qint16 signed short 16位資料型別 qint32 signed int.32位有符號資料型別 qint64 long long int 或 int64 64位有符號資料型別,windows中定義為 int64 qintptr ...

qt的基本資料型別

qint8 有符號的8位元資料 qint16 16位資料型別 qint32 32位有符號的資料型別 qint64 或者 int64 64位有符號的資料型別,windows中定義為 int64 qintptr 或者 指標型別,根據系統型別不同而不同,32位系統為qint32,64位系統為qint64 ...

Qt中的基本資料型別

1.1 基本資料型別qglobal 1.2常用函式qreal abs 4.567 qreal myvalue1,myvalue2,myvalue3,myvalue4 qint32 int a 6 qint32 int b 4 qint32 int c 7 myvalue1 qabs abs myva...