首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >布尔值在.NET中是两个字节吗?

布尔值在.NET中是两个字节吗?
EN

Stack Overflow用户
提问于 2013-01-20 23:21:06
回答 2查看 3.4K关注 0票数 17

这个问题源于here。我在VS中尝试了下面的语句,看看会发生什么:

代码语言:javascript
复制
Len(Name <= 3)

根据this answerthis one的说法,Boolean应该占用4个字节。根据MSDN的说法,Len Function in VB

返回一个整数,其中包含字符串中的字符数或存储变量所需的标称字节数。

Name <= 3应该将3转换为字符串,并执行字符串比较,返回一个布尔值,因此Len应该计算其中的字节数,它应该是4。由于某种原因,上面的代码返回2,而不考虑第二个参数。换句话说,对于不同的平台目标(32和64),Len(True)也返回2.

为什么 Len(Boolean) 返回2而不是4?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-20 23:44:56

对于用户定义的类型和对象变量,Len函数返回FilePut函数将其写入文件时的大小。

如果一个对象包含一个字符串,它将返回字符串的长度。如果对象包含任何其他类型,它将返回对象的大小,因为它将由FilePut函数写入文件。

Len()是一个遗留函数,应该只在从上一代Visual Basic项目移植过来的代码中使用。它通常出现在涉及VB值的二进制序列化的代码中。基本类型的大小在这些旧版本中是不同的。例如,Integer是16位的,解释了你在web上发现的大量使用Long的糟糕的pinvoke声明。Boolean是一个隐藏在引擎盖下的VARIANT_BOOL,一个16位的值。更奇怪的是,将其True值转换为-1而不是1。

显然,对于由VB6程序编写的文件中存在的大量数据,采用.NET大小将是一个严重的破坏性更改。或通过TCP连接发送的二进制数据。等等。因此,Len()函数返回遗留的大小。

票数 16
EN

Stack Overflow用户

发布于 2013-01-20 23:40:41

根据MSDN的Data Type Summary (VS2012),布尔值的大小取决于实现平台。但是,如果您查看the same page for VS2003,它确实显示布尔值是2个字节。

ECMA-335第III.1.1.1节规定:

求值堆栈只能保存4字节或8字节的整数,但其他位置(参数、局部变量、静态变量、数组元素、字段)可以保存1字节或2字节的整数。出于堆栈操作的目的,bool (§III.1.1.2)和char类型分别被视为无符号的1字节和2字节整数。从这些位置加载到堆栈上会将它们转换为4字节值

第III.1.1.2节规定:

CLI类型占用内存中的1个字节。

全零的位模式表示值为false。设置了任何一个或多个位(类似于非零整数)的位模式表示值为true。出于堆栈操作的目的,布尔值被视为无符号1字节整数

因此,考虑到这一点,我感到更困惑的是,为什么你得到2而不是1

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14425984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档