关于c++中的char和bool

本文深入探讨了C语言中char类型的符号性定义及其在内存中的存储方式,通过实验验证了char与bool数组在不同平台上的内存消耗差异,并提供了验证方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

起因

今天刷OJ发现一个有意思的事儿。题目中需要计算一定范围内的质数,我申请了一个数组,所有元素有0、1、-1三种状态。如果数组使用int的话用时240ms,36M内存。如果换成char就变成了140ms,9M内存。这就引出了两个问题:1. 为什么变快了;2. char原来是有符号的?

char的符号

这个问题很好解决,Google之后发现C标准中将char规定为Implementation Defined(由实作环境决定)。具体而言,arm平台上char是无符号的,而intel平台上char是有符号的。

如果想验证的话,在自己的平台上给char赋值128,如果是无符号整数那么输出应该还是128,如果是有符号整数那么输出应该是-128。

char的计算

缺乏这方面知识,查完相关资料在补充这段吧。

bool的存储

跟同学的代码进行对比之后我又发现一个问题:他的数组使用的是bool,但内存消耗跟我一样!这说明bool虽然只有0和1两种状态,但在内存中却占用了一个byte而非一个bit。

如果想验证的话,申请一个bool数组,全部赋值为1,然后一个byte一个byte往外读。如果是按bit存储,这个字节内容应该是11111111,如果是按byte存储,应该是00000001。

### 将 `bool` 类型转换为 `char` 类型 在 C++ 中,可以轻松地将 `bool` 类型转换为 `char` 类型。由于 `true` `false` 实际上会被解释为整数值 1 0,在执行字符赋值操作时这些整数会进一步被映射到对应的 ASCII 字符。 #### 使用显式类型转换 可以直接通过静态强制转换来实现这一目的: ```cpp #include <iostream> int main() { bool myBool = true; char myChar = static_cast<char>(myBool); std::cout << "The character representation of 'true' is: " << myChar << std::endl; myBool = false; myChar = static_cast<char>(myBool); std::cout << "The character representation of 'false' is: " << myChar << std::endl; } ``` 上述代码片段展示了如何利用 `static_cast` 进行从布尔值向字符类型的转换[^1]。当 `myBool` 的值分别为 `true` `false` 时,程序输出相应的字符表示形式。需要注意的是,默认情况下,这只会给出对应于ASCII码表中位置10的结果,即通常不可打印的控制字符。 为了获得更具可读性的结果,比如 `'T'` 对应 `true`, `'F'` 对应 `false`,则需自定义逻辑处理: ```cpp #include <iostream> #include <cctype> // For toupper function char BoolToReadableChar(bool val) { return val ? 'T' : 'F'; } int main() { bool myBoolTrue = true; bool myBoolFalse = false; std::cout << "Custom readable conversion from 'true': " << BoolToReadableChar(myBoolTrue) << std::endl; std::cout << "Custom readable conversion from 'false': " << BoolToReadableChar(myBoolFalse) << std::endl; } ``` 这段改进后的版本提供了更直观易懂的方式展示布尔变量的状态,而不仅仅是依赖其内部存储的形式。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值