我正在使用一些VB.NET代码,似乎是使用一个整数的布尔值CInt(myBoolean).发生的奇怪事情是,如果值为true,则返回-1.例如:
CInt(True) // returns -1
CInt(False) // returns 0
Run Code Online (Sandbox Code Playgroud)
这在其他语言中常见吗?
我认为布尔值如果为真则为1,如果为假则为0.另外,有没有办法让Visual Basic将1赋值为true而不是赋值-1?
C#规范(ECMA-334和ISO/IEC 23270)有一段关于读写的原子性:
12.5变量引用的原子性
以下数据类型的读取和写入应为原子:bool,char,byte,sbyte,short,ushort,uint,int,float和reference类型.此外,在先前列表中具有基础类型的枚举类型的读取和写入也应该是原子的.其他类型的读写,包括long,ulong,double和decimal,以及用户定义的类型,不一定是原子的.
但我很难想象永远是真的.例如,我可以使用StructLayout属性布局结构,并强制字段不对齐:
// sizeof(MyStruct) == 9
[StructLayout(LayoutKind.Sequential, Pack = 1)]
struct MyStruct
{
public byte pad; // Offset: 0
public int value1; // Offset: 1
public int value2; // Offset: 5
}
Run Code Online (Sandbox Code Playgroud)
现在,当我这样做,我会觉得写的int是不是原子的,因为它没有对齐的自然边界:
MyStruct myStruct = new MyStruct();
myStruct.value1 = 20;
Run Code Online (Sandbox Code Playgroud)
那么,它是绝对原子的(就像规范所说的那样),还是不能保证是原子的(例如在x86上)?无论哪种方式,你有任何消息来支持这个吗?