我将VisualStudio2013用于x64系统。我有以下结构:#pragmapack(1)structTimeStruct{intmilliseconds:10;BYTEseconds:6;BYTEminutes:6;BYTEhour:5;BYTEday:5;};#pragmapack()和一个数组:TimeStructstArray[10];当我使用sizeof(stArray);时,我得到80而不是40。我需要知道问题是编译器没有正确打包还是sizeof没有考虑位域的实际大小。谢谢 最佳答案 参见WhatisVC++doin
这是声明位域的方式:unsignedm_bitfield1:2;//abitfieldthatoccupies2bitsunsignedm_bitfield2:1;//abitfieldthatoccupies1bit位域只是一个具有特定位大小的小域。我的问题是:我是否可以使用自己的算法来处理默认数据类型(例如占用大量不必要空间的整数或float)作为任意大小的较小部分的集合,或者使用位域有一些隐藏的好处?谢谢。 最佳答案 可以将整数用作您自己访问和管理的位的集合。但是经常有un-thought-ofcosts使用编译器生成的位字段
当我尝试编译以下union时,弹出此警告:10:5:note:offsetofpackedbit-field'main()::pack_it_in::::two'haschangedinGCC4.4#pragmaGCCdiagnosticignore"-Wpacked-bitfield-compat"unionpack_it_in{struct{uint8_tzero:3;uint8_tone:2;uint8_ttwo:6;uint8_tthree:4;uint8_tfour:1;}__attribute__((packed))u8_2;uint16_tu16;};#pragmaGCC
我有一个64位longint,其中包含一些位域。我需要将存储在第二个和第三个字节中的16位带符号整数添加到一个32位值中。我正在使用这样的东西:u32Function(s32value,u64bitfield){returnvalue+(s16)(bitfield>>8)}在将位域扩展为32位有符号整数并执行加法之前,我能否依赖编译器将位域转换为16位有符号整数?如果不是,我还应该如何截断剩余字节并执行我需要的类型转换? 最佳答案 是的,需要注意的是您依赖于特定于编译器和体系结构的行为。当然,依赖这种行为会使您陷入真正难以诊断的“特