为什么是Bool和Bool而不是int8\t或char? 我在C和 Boo. C++中,对代码< >代码> < Boo> >代码> BOOL ( STDBOOL .H < /COD> >)进行了思考。
我们使用布尔类型来声明对象,这些对象只应包含0或1的值。 例如:为什么是Bool和Bool而不是int8\t或char? 我在C和 Boo. C++中,对代码< >代码> < Boo> >代码> BOOL ( STDBOOL .H < /COD> >)进行了思考。,c++,c,types,boolean,C++,C,Types,Boolean,我们使用布尔类型来声明对象,这些对象只应包含0或1的值。 例如: _Bool bin = 1; 或 (注意:bool是\u bool在stdbool.h的头文件中的宏) 在C中 或 < C++ > 但是\u Bool和Bool的布尔类型真的有效吗 我做了一个测试来确定内存中每个对象的大小: 对于C: #include <stdio.h> #include <stdbool.h> // for "bool" macro. int main() { _B
_Bool bin = 1;
或
(注意:bool
是\u bool
在stdbool.h
的头文件中的宏)
在C中
或
< C++ >
但是
\u Bool
和Bool
的布尔类型真的有效吗
我做了一个测试来确定内存中每个对象的大小: 对于C:
#include <stdio.h>
#include <stdbool.h> // for "bool" macro.
int main()
{
_Bool bin1 = 1;
bool bin2 = 1; // just for the sake of completeness; bool is a macro for _Bool.
printf("the size of bin1 in bytes is: %lu \n",(sizeof(bin1)));
printf("the size of bin2 in bytes is: %lu \n",(sizeof(bin2)));
return 0;
}
对于C++:
#include <iostream>
int main()
{
bool bin = 1;
std::cout << "the size of bin in bytes is: " << sizeof(bin);
return 0;
}
因此,布尔类型的对象确实存储在内存中的1字节(8位)内,而不是像通常所需的那样仅存储在1位中 此处讨论的原因:。这不是我的问题
我的问题是:
-
为什么我们在C++和<代码> Boo< <代码>中使用了<代码> >代码> >代码> BoOL (<代码> STDBOOL,H < /COD> >,如果他们做了<强>不>强>在内存存储中提供了一个好处,因为它被专门假装使用这些类型?
- 为什么我不能只使用
或int8\u t
的类型(假设char
在具体实现中包含8位(通常是这种情况)来代替char
0
或1
/true
或false
目的
非常感谢您的参与
<>为什么我们在C++中使用了C-BOO/BOOL(STDBOOL?H)类型,如果它们在内存存储中没有提供好处,因为它被专门假装使用这些类型?
您在问题中已经提到了原因:
我们使用布尔类型来声明对象,这些对象只应包含0或1的值
特别使用布尔数据类型的优点是,它只能表示true或false。其他整数类型具有更多可表示的值,当您只需要两个时,这是不需要的
为什么我不能只使用int8_t或char的类型(假设在具体实现中char包含8位(通常是这种情况)来代替呢
你可以。事实上,C直到C99标准才有布尔数据类型。请注意,使用int8_t
的缺点是不能保证由所有系统提供。char的问题是它可以是有符号的,也可以是无符号的
但您不需要这样做,因为您可以使用布尔数据类型
这意味着在布尔类型中使用True或false与在char或int8\t中使用True或false时存在差异。你能说明这一区别吗 考虑以下简单的例子:
int8_t i = some_value;
bool b = some_value;
if (i == true)
if (i)
if (b == true)
if (b)
对于int8\u t
,这两个条件具有不同的行为,如果选择了错误的形式,这就为行为创造了错误的机会。对于布尔型,它们具有相同的行为,没有错误的选择
另外,如果您想紧凑地存储多个布尔值(以每次读写多条指令为代价),例如,您可以使用
std::bitset
或std::vector
。在C语言中没有类似的标准库实用程序,但这种功能可以通过移位和掩蔽来实现。有多种效率。内存效率是其中之一。速度效率是另一个原因
原始C语言根本没有boolean
类型——程序员通常会使用int
作为布尔标志,0
表示false,1
表示true。如果他们真的关心内存效率,他们可能会使用位图在一个字节中存储八个布尔值,但这通常只在内存非常缺乏的情况下才有必要。但是访问int
要比访问int
然后解压缩其组成位快
\u Bool
/Bool
是在C99中引入的。它反映了将布尔值存储在int中的常见做法
但是,它的优点是编译器知道它是一个布尔值,因此更难意外地为它赋值3
,将其添加到整数中,等等
现在大多数编程语言都将布尔值存储在一个字节中。是的,它使用的内存是所需内存的八倍——但是它速度很快,而且很少有一次有这么多布尔运算,以至于浪费了大量内存
在许多编程语言中,实现与语言规范是分开的——Javascript规范没有说明Javascript运行时应该如何存储true
或false
。然而,在C99中,您可以依赖于true
等同于整数1
如果布尔值确实占用了太多的系统内存,您可以使用逐位操作将8个布尔值存储在无符号字符中,或者更大的类型中
如果需要,您可以对运行时操作执行此操作,或者仅在写入输出格式时执行此操作(如果问题是文件系统或网络数据包上记录的大小)
但是,值得注意的是,在许多现代应用程序中,人们非常乐意将false
表示为7个字节['”、'f'、'a'、'l'、's'、'e'、''']
使用bool和int的原因之一是为了提高代码的可理解性,让后面的人能够理解并维护代码
想想这些
布尔b;
INTC
如果(b==c)
c=2;
b=2
现在,我要说的是,将布尔值(真或假)与数字进行比较很可能是一个错误。所以像‘if(b==1)’这样的东西可能表示编码错误。I h
the size of bin1 in bytes is: 1
the size of bin2 in bytes is: 1
#include <iostream>
int main()
{
bool bin = 1;
std::cout << "the size of bin in bytes is: " << sizeof(bin);
return 0;
}
the size of bin in bytes is: 1
int8_t i = some_value;
bool b = some_value;
if (i == true)
if (i)
if (b == true)
if (b)