1. 程式人生 > >關於c++中的char和bool

關於c++中的char和bool

起因

今天刷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。

相關推薦

C++char *char []的區別

以前一直覺得這兩個有區別,但也沒深究,今天寫了個程式碼報了警告於是就看了看,總結如下。 例如如下程式碼: #include<iostream> using namespace std; int main() { char *p1

關於c++charbool

起因 今天刷OJ發現一個有意思的事兒。題目中需要計算一定範圍內的質數,我申請了一個數組,所有元素有0、1、-1三種狀態。如果陣列使用int的話用時240ms,36M記憶體。如果換成char就變成了140ms,9M記憶體。這就引出了兩個問題:1. 為什麼變快了;

c++ string const char * 的相同不同,遇到的坑。

#include<iostream> #include<string> using namespace std; string ToString(int i) { string str = std::to_string(i); return str; } int mai

C#C++char型別的區別

對於char,這個字元型別。我們一般都認為就是一個位元組。今天在仔細比較發現,C#的char和C++的char是有區別的。 1.首先來看C#中char佔多大空間 using System; using System.Collections.Generic; usin

C#&&&,|||區別

.com blank img cnblogs png ref bsp 筆記 區別 當兩者都為邏輯運算符時。 其實沒什麽差別。 &&和||當已經確定結果時,不會對第二個操作數求值。也不知道什麽情況會用到這個差別。做個筆記好了。 http://blog.cs

C++typenameclass的區別

type .get true 能夠 class .... ray pla 依賴 在c++Template中很多地方都用到了typename與class這兩個關鍵字,而且好像可以替換,是不是這兩個關鍵字完全一樣呢? 相信學習C++的人對class這個關鍵字都非常明白,clas

C++數字字符串的轉換

oat 不能 ring1 相關 輸出 displays tof spl 進制轉換 1、字符串數字之間的轉換(1)string --> char * string str("OK"); char * p = str.c_str();(2)char * -->

C++static_castdynamic_cast強制類型轉換

tro 父類 虛函數表 找到 virt 內部 pub 判斷 () 在C++標準中,提供了關於類型層次轉換中的兩個關鍵字static_cast和dynamic_cast。 一、static_cast關鍵字(編譯時類型檢查) 用法:static_cast < type-i

C++的###運算符

合並操作 col 否則 未定義 info merge eight 標識符 轉換 #和##運算符 #:構串操作符 構串操作符#只能修飾帶參數的宏的形參,它將實參的字符序列(而不是實參代表的值)轉換成字符串常量 #define STRING(x) #x#x#x #defin

c#ClassStruct使用與性能的區別

回收 數據結構 com 垃圾回收 父類 改變 med .cn 指針 在Unity中很多已經定義為結構體的數據結構 Vector2, Vector3 和 Vector4 Rect Color和Color32 Bounds Touch 1.Class為引用類型,Str

C#MonitorLock以及區別

能夠 program tor 試圖 tro 指定 object span () 原文地址:http://www.cnblogs.com/chengxingliang/p/3150731.html   Monitor對象   1.Monitor.Enter(object)方法

C#Convertparse的區別

處理 捕獲 用戶 整數 request 存在 query 轉換 中間 Convert.ToInt32()與int.Parse()的區別(1)這兩個方法的最大不同是它們對null值的處理方法: Convert.ToInt32(null)會返回0而不會產生任何異常,但int.P

C#&&&的區別

poi log sha 與操作 位運算 orm 第一個 pre 繼續 SiKi老師讓我們自行查一下&和&&的區別,So... 1)&和&&都可以用作邏輯與的運算符,表示邏輯與(and),當運算符兩邊的表達式的結果都為tru

C/C++nearfar的區別

語言 補充 detail net 計算機體系結構 偏移 單元 體系結構 all C/C++中near和far的區別 關鍵字near和far受目標計算機體系結構的影響。目前編程中使用不多。 near關鍵字創建一個指向可尋址內存低端部分的目標指針。這些

C#virtualabstract的區別

tool 保留 到你 variable var 入口 printf static write 解讀一 c# 中 Abstract和Virtual比較容易混淆,都與繼承有關,並且涉及override的使用。下面討論一下二者的區別: 一、Virtual方法(虛方法)   vir

C#GetPost請求的同步及異步方法

iter epo charset result string pty streambuf div httpget 在C#中發起Http請求一般使用HttpWebRequest這個類,下文將使用這個HttpWebRequest對象來對Get和Post的同步及異步請求進行封裝:

C#AbstractVirtual的區別

保留 一個 strac 虛擬 ati AI 靜態方法 void ride c# 中 Abstract和Virtual比較容易混淆,都與繼承有關,並且涉及override的使用。下面討論一下二者的區別: 一、Virtual方法(虛方法)   virtual 關鍵字用於在基

C++const#define的利弊探索

C++學習 C++學習總結 C++靈感 const和#define的利弊,從而推導const的意義; const和#define都有類似的功能,那就是定義一個“常量”; 想用來替換#define定義常量這種方式。這是一種定義宏的方式。因為宏替換定義常量有一定的缺陷:不做類型檢查,沒有作用域限制(這

c# xmljson 互相轉換

XML serialize AD -- ldo data nod load str --xml轉json XmlDocument doc = new XmlDocument(); doc.LoadXml(result); st

C++char類型的十六進制字符串轉換成字節流

toupper 14. 轉換成 urn 類型 else con src for 如a[5]="1234"轉換成a[5]={0x12,0x34} 代碼如下: void HexStrToByte(const char* source, unsigned char* dest