我理解为了在C#中表示联合,我需要使用StructLayout [LayoutKind.Explicit]]和[FieldOffset(x)] attribut来指定联合内部的字节偏移量.但是,我有一个我想要表示的跟随联合,而FieldOffset属性仅偏移一个字节的大小.
union _myUnion
{
unsigned int info;
struct
{
unsigned int flag1:1 // bit 0
unsigned int flag2:1 // bit 1
unsigned int flag3:1 // bit 2
unsigned int flag4:1 // bit 3
unsigned int flag5:1 // bit 4
unsigned int flag6:1 // bit 5
.
.
.
unsigned int flag31:1 // bit 31
}
}
Run Code Online (Sandbox Code Playgroud)
正如你在联合中看到的内部结构一样,我不能使用FieldOffset,因为我需要一些可以稍微偏移的东西.
这个问题有方法解决吗?我试图调用一个DLL函数,其中一个数据结构被定义为这样,我没有关于如何最好地表示这个联合结构的想法.
有人提醒我注意以下程序:
#include <stdio.h>
struct X50 {
long long int z:50;
} s50 = { 2 };
struct X10 {
long long int z:10;
} s10 = { 2 };
int main() {
printf("%zu %zu %zu\n",sizeof(long long int),sizeof(s10.z+1),sizeof(s50.z+1));
}
Run Code Online (Sandbox Code Playgroud)
表达式的类型sizeof(lv.z+1)是根据"通常的算术转换"计算的,几乎可以说左值的类型大小lv.z将反映在加法的类型上,只要它至少是这样int.
我没想到这种类型取决于位域的大小,但确实如此:GCC和Clang都打印8 4 8在我的计算机上.
我在C99标准中的相关条款是第2条中6.3.1.1,这似乎也不是那么说的位域没有任何根据_Bool,int,signed int,或unsigned int.该子句的第二部分,"如果一个int可以表示原始类型的所有值,该值转换为一个int,......",似乎只适用于该条款第一部分所述的条件,即不包括基于的位域long long int.
此外,6.7.2.1说:
位字段的类型应为_Bool,signed int,unsigned int或其他实现定义类型的限定或非限定版本.
是否因为long long int位域超出了标准的范围,编译器可以发明自己的规则,或者可以在C99的其他地方找到Clang和GCC行为的某种理由?
我发现这个问题 …
Enum.GetName()如果枚举已使用[Flags]属性进行修饰,则看起来不起作用.
该文档未指定与此限制相关的任何内容.
我注意到调试器能够显示像Tree一样的东西 水果.有没有办法检索描述组合标志的文本字符串?
以下代码显示Red.
public enum FavoriteColor
{
Red,
Blue,
WeirdBrownish,
YouDoNotEvenWantToKnow,
}
var color = FavoriteColor.Red;
Console.WriteLine(Enum.GetName(typeof(FavoriteColor), color)); // => "Red"
Run Code Online (Sandbox Code Playgroud)
虽然这个没有输出任何东西....
[Flags]
public enum ACherryIsA
{
Tree = 1,
Fruit = 2,
SorryWhatWasTheQuestionAgain = 4,
}
var twoOfThree = ACherryIsA.Fruit | ACherryIsA.Tree;
Console.WriteLine(Enum.GetName(typeof(ACherryIsA), twoOfThree)); // => ""
Run Code Online (Sandbox Code Playgroud) 我的问题是关于指向奇怪大小的内存块.
假设我有这样的struct声明:
typedef struct{
int32 val1 : 29;
int32 val2 : 26;
char val3;
}MyStruct;
Run Code Online (Sandbox Code Playgroud)
让我们假设在结构中声明特定的位字段是可取的(为什么我们使用位字段不是问题).
如果我想声明一个指向其中一个字段的指针,我可能会尝试这样的事情:
MyStruct test;
int32 *myPtr = &(test.val1);
Run Code Online (Sandbox Code Playgroud)
除此之外产生错误" 不允许使用位字段的地址 ".
假设我们想要,有没有办法以这种方式指向这些领域?我知道C++可能会将字段填充到下一个字节(在本例中为32位).
可能重复:
使用bool进行C++位域打包
bool在位域定义中使用C++的关键字是否安全?
就像是:
struct flags {
bool a : 1;
bool b : 1;
}
Run Code Online (Sandbox Code Playgroud) 由于C++标准在很多方面都非常模糊,我想从不同的编译器中查找具体的实现.目前,我想知道GCC如何分配和对齐位字段.
对于MS Visual C++编译器,它非常简单:用户手册中有一个关于位字段的精美页面,它解释了所有开放分配/对齐问题,甚至还有数字和示例.
我只想要GCC的相同信息,但似乎更复杂.GCC手册中有一页只是说"由ABI决定".然后我们有一些关于ABI策略和指南的信息,其中包含指向Github上名为Itanium C++ ABI的文档的链接.现在,在本文档中,我们可以找到以下内容:"根据底层C psABI的要求分配位域".这就是我被困住了.搜索C psABI时,我找不到有用的网站.
任何人都可以请我指向GCC的位域实现的网站吗?它不能那么复杂,不是吗?为什么GCC的文档往往比微软的文档复杂得多?我使用了错误的资源吗?
嗨,
这是我第一次使用POI(Java Excel解决方案)的经验,我试图将其中一行中的缩进设置为17,如下所示:
CellStyle style = repSheetPositions.getRow(2).getCell(0).getCellStyle();
Run Code Online (Sandbox Code Playgroud)
当我检查缩进的值是:
short a = style.getIndention();
Run Code Online (Sandbox Code Playgroud)
a = 15
我将值更改为:
repSheet.getRow(2).getCell(0).getCellStyle().setIndention((short) 17);
Run Code Online (Sandbox Code Playgroud)
这次的价值是:
short a = style.getIndention();
Run Code Online (Sandbox Code Playgroud)
a = 1
请你帮助我好吗?
非常感谢!
我有一个SCNetworkReachabilityFlags变量,想要检查它的特定值,例如,如果网络可以通过WWAN访问.
的SCNetworkReachabilityFlags类型是typealias用于UInt32与各种选项被定义为Int变量.
使用Objective-C,您可以执行以下操作:
if (flags & kSCNetworkReachabilityFlagsIsWWAN) {
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
在Swift中如果我试试这个:
if reachabilityFlags & kSCNetworkReachabilityFlagsIsWWAN {
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
你得到一个编译器错误:Could not find an overload for '&' that accepts the supplied arguments.
我已经阅读了一些其他问题,其中位域选项定义为RawOptionSet结构.这还没有完成SCNetworkReachability.
如何检查Swift中的标志?
我试图检查关于C++的QA练习,一个问题让我抓狂!
typedef struct {
unsigned int i : 1;
} myStruct;
int main()
{
myStruct s;
s.i = 1;
s.i++;
cout << s.i;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题是什么是输出:0/1/2/3/-1 /段错误?
我确实检查了2这是一个错误的答案:D,那么为什么程序显示为0?
在编写代码时,我在代码中观察到一件事,它与比特字段值与负整数的比较有关.
我有一个大小为1位的无符号结构成员和一个unsigned int.当我将负值与unsigned int变量进行比较时,我得到预期的结果为1但是当我将结构成员与负值进行比较时,我得到的结果相反为0.
#include <stdio.h>
struct S0
{
unsigned int bit : 1;
};
struct S0 s;
int main (void)
{
int negVal = -3;
unsigned int p = 123;
printf ("%d\n", (negVal > p)); /*Result as 1 */
printf ("%d\n", (negVal > s.bit));/*Result as 0 but expected 1 */
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我怀疑的是,如果我将负值与unsigned int进行比较,那么将发生平衡(隐式类型转换).但是如果我比较unsigned int的结构成员为什么没有发生隐式类型转换.如果我错过任何基本的比特字段,请纠正我?