Stack Overflow问题的一些答案获取浮点数的IEEE单精度位建议使用union类型双关的结构(例如:将a的位float转换为a uint32_t):
union {
float f;
uint32_t u;
} un;
un.f = your_float;
uint32_t target = un.u;
Run Code Online (Sandbox Code Playgroud)
但是,uint32_t根据C99标准(至少草案n1124),联盟成员的值似乎未指定,其中第6.2.6.1.7节规定:
当值存储在union类型的对象的成员中时,对象表示的字节与该成员不对应但与其他成员对应的字节采用未指定的值.
C11 n1570草案至少有一个脚注似乎暗示不再是这种情况(见6.5.2.3中的脚注95):
如果用于读取union对象的内容的成员与上次用于在对象中存储值的成员不同,则将值的对象表示的适当部分重新解释为新类型中的对象表示形式在6.2.6中描述(一个过程有时被称为''punning'').这可能是陷阱表示.
但是,第C.6.6.1.7节中的案文与C11草案中的C99草案相同.
这种行为在C99下实际上是未指定的吗?它是否在C11中指定?我意识到大多数编译器似乎都支持这一点,但是知道它是在标准中指定还是只是一个非常常见的扩展会很好.
我试图弄清楚一些C代码,以便我可以将它移植到python中.该代码用于读取专有的二进制数据文件格式.到目前为止它一直很简单 - 它主要是结构,我一直在使用struct库来从文件中请求特定的ctypes.但是,我刚刚提到了这段代码,我对如何在python中实现它感到茫然.特别是,我不知道如何处理enum或者union.
#define BYTE char
#define UBYTE unsigned char
#define WORD short
#define UWORD unsigned short
typedef enum {
TEEG_EVENT_TAB1=1,
TEEG_EVENT_TAB2=2
} TEEG_TYPE;
typedef struct
{
TEEG_TYPE Teeg;
long Size;
union
{
void *Ptr; // Memory pointer
long Offset
};
} TEEG;
Run Code Online (Sandbox Code Playgroud)
其次,在下面的struct定义中,我不确定变量名后面的冒号是什么意思,(例如KeyPad:4).这是否意味着我应该读4个字节?
typedef struct
{
UWORD StimType;
UBYTE KeyBoard;
UBYTE KeyPad:4;
UBYTE Accept:4;
long Offset;
} EVENT1;
Run Code Online (Sandbox Code Playgroud)
如果它有用,我在python中访问文件的方式的抽象示例如下:
from struct import unpack, calcsize
def get(ctype, size=1):
"""Reads and unpacks binary … union data {
double number2;
char name[20];
};
int main() {
printf("%i\n", sizeof(union data));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我预计它是 20,因为它是最大的,但结果是 24。
我有以下联盟
typedef union rem{
int addr;
char addrbuf[32];
} foo;
Run Code Online (Sandbox Code Playgroud)
union上的sizeof提供以下输出
foo addr;
printf("size is: %d\n",sizeof addr);
Run Code Online (Sandbox Code Playgroud)
大小是:32
这是否意味着union在定义时分配或需要等于union中最大元素的内存?
我在GPU端(cuda)中定义了这样的新数据类型:
typedef union {
int i;
double d;
long l;
char s[16];
} data_unit;
data_unit *d_array;
Run Code Online (Sandbox Code Playgroud)
在Java中,我们拥有定义的并集中可用数组之一的数组。通常,如果我们有一个int类型的数组,则可以在Java(JCuda)中执行以下操作:
import static jcuda.driver.JCudaDriver.*;
int data_size;
CUdeviceptr d_array;
int[] h_array = new int[data_size];
cuMemAlloc(d_array, data_size * Sizeof.INT);
cuMemcpyHtoD(d_array, Pointer.to(h_array), data_size * Sizeof.INT);
Run Code Online (Sandbox Code Playgroud)
但是,如果设备上的数组类型是我们的联合,该怎么办呢?(假设h_array仍然是int类型)
int data_size;
CUdeviceptr d_array;
int[] h_array = new int[data_size];
cuMemAlloc(d_array, data_size * Sizeof.?);
// Here we should have some type of alignment (?)
cuMemcpyHtoD(d_array, Pointer.to(h_array), data_size * Sizeof.?);
Run Code Online (Sandbox Code Playgroud) 我不确定问题是否妥善,因为我理解了如何,但我不知道用不明白的东西写问题.这里是:
我有一些课程:
class Animal{};
class Rabbit{}: public Animal;
class Horse{}: public Animal;
class Mouse{}: public Animal;
class Pony{}: public Horse;
Run Code Online (Sandbox Code Playgroud)
我的目标是从此对象列表中找到最大大小,以便在之后的内存分配中使用它.我已将每个sizeof对象存储在一个数组中,然后获取数组的最大值.上级(我发送代码进行审核)建议我使用union来在编译前的时间找到最大的大小.这个想法对我来说似乎很好,所以我这样做了:
typedef union
{
Rabbit rabbitObject;
Horse horseObject;
Mouse mouseObject;
Pony ponyObject;
} Size;
Run Code Online (Sandbox Code Playgroud)
...因为union根据最大元素分配内存.下一个建议就是这样做:
typedef union
{
unsigned char RabbitObject[sizeof(Rabbit)];
unsigned char HorseObject[sizeof(Horse)];
unsigned char MouseObject[sizeof(Mouse)];
unsigned char PonyObject[sizeof(Pony)];
} Interesting;
Run Code Online (Sandbox Code Playgroud)
我的问题是:
Interestingunion 如何获得对象的最大大小?对我来说,创建一个unsigned char类型的数组是没有意义的sizeof(class).为什么第二个选项可以解决问题,而之前的联盟却没有?背后发生了什么,我想念?
PS:条件是这样的,我不能亲自问这个家伙.
先感谢您
我现在正在使用向量和矩阵,有人建议我应该使用SSE而不是使用float数组.然而,在阅读C内在函数和汇编指令的定义时,看起来有一些函数的不同版本,其中向量必须是"16字节对齐",而较慢的版本,其中向量未对齐.矢量是16字节对齐的意思是什么?如何确保我的向量是16字节对齐的?