![](/img/trans.png)
[英]Convert one 32bit float number into two 16bit uint number and then convert back to that 32bit float again
[英]Struct Alignment & Access two 16bit fields via pointer to 32bit
我在結構對齊上遇到問題。 看來不管我做什么,編譯器都會在結構的兩個字段之間插入一個字節。 這是輸出的樣本
4 +j 4 +++ 40004 ......... 4
5 +j 5 +++ 50005 ......... 5
6 +j 6 +++ 60006 ......... 6
7 +j 7 +++ 70007 ......... 7
8 +j 8 +++ 80008 ......... 8
9 +j 9 +++ 90009 ......... 9
字節00插入在H結構的re和im字段之間。 如何停止編譯器對H進行操作,以便指針pW可以通過指針pW讀取32位的兩個字段?
也許我需要更改3d數組的大小。 如果有一種方法不更改數組大小,那就太好了。
#include <stdio.h>
#include <stdlib.h>
#define NA 4
#define NS 3
#define NF 5
typedef struct {
short re;
short im;
} cint16 ;
typedef struct
{
cint16 H[NRx][NSTS][NFFT];
} AAA;
AAA H;
AAA * pH = &H;
int main(void)
{
int i, j, k, n, m;
cint16 * pC;
int * pW;
n = 0;
for(i=0; i<NA; i++)
{
for(j=0; j<NS; j++)
{
for(k=0; k<NF; k++)
{
H.H[i][j][k].re = n ;
H.H[i][j][k].im = n;
n++;
}
}
}
pC = &H.H[0][0][0];
m = 0;
for(k=0; k<NA; k++)
{
for(i=0; i<NS; i++)
{
for(n=0; n<NF; n++)
{
printf("%02d ", pC[m].re );
printf("+j%02d,", pC[m].im );
printf(" ");
m++;
}
printf("\n");
}
}
printf("\n\n");
pW = (int *)&H.H[0][0][0];
pC = &H.H[0][0][0];
m = 0;
for(k=0; k<NA*NS*NF; k++)
{
printf("%2X ", pC[m].re );
printf("+j%2X", pC[m].im );
printf(" +++ ");
printf("%X ", pW[m] );
printf(" ......... %d \n", m);
m++;
}
exit (0);
}
您誤解了輸出。
printf("%X ", pW[m] );
以十六進制表示形式將結構的四個字節打印為unsigned int
4|00|04
前4
來自struct成員的一個非零字節,該字節對應於unsigned int
的高位字節(無論是re
還是im
取決於字節序),接下來的兩個字節00
和04
來自這兩個字節其他成員的。
成員之間沒有插入字節,由於抑制了前導零,所以沒有打印出一個字節(和一個半字節)。
這取決於您使用的編譯器。 在GCC上有__attribute__ ((__packed__))
,在VC ++上有#pragma pack
。
SO上可能有很多重復的問題,這些問題說明了如何使用這些問題。
還有一點警告:使用32位整數訪問兩個16位值將在很大程度上取決於基礎平台的字節順序。 例如,如果通過Internet或通過文件發送此結構,則必須確保正確轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.