沒事寫了一下逆轉字串,當然這本來就是很簡單的**,**如下:
#include#includeint main(int argc,char **argv)
std::cout《乍一看這個**好像沒什麼問題,編譯也不會有什麼問題,但是執行:
123段錯誤 (核心已轉儲)
使用linux的人看見段錯誤,基本都會明白是容器或者說陣列越界了。
用gdb執行:
breakpoint 1, main (argc=1, argv=0x7fffffffdc08) at main.cpp:14
14 {
(gdb) n
15 std::string a,b;
(gdb) n
16 std::cin>>a;
(gdb) n
12317 for(std::string::size_type i = a.size()-1; i >= 0; --i)
(gdb) p i
$1 = 4197409
(gdb) n
19 b.push_back(a[i]);
(gdb) p i
$2 = 2
(gdb) n
17 for(std::string::size_type i = a.size()-1; i >= 0; --i)
(gdb) p i
$3 = 2
(gdb) n
19 b.push_back(a[i]);
(gdb) p i
$4 = 1
(gdb) n
17 for(std::string::size_type i = a.size()-1; i >= 0; --i)
(gdb) p i
$5 = 1
(gdb) n
19 b.push_back(a[i]);
(gdb) p i
$6 = 0
(gdb) n
17 for(std::string::size_type i = a.size()-1; i >= 0; --i)
(gdb) p i
$7 = 0
(gdb) n
19 b.push_back(a[i]);
(gdb) p i
$8 = 18446744073709551615
前面的遞減都沒什麼問題,就是最後一次,i==0時,自減後變成了18446744073709551615,那麼明顯就是無符號數,原因就是出現在std::string::size_type 型別上,
我們為什麼不適用int變數來儲存string的size呢?
使用int變數的問題是:有些機器上的int變數的表示範圍太小,甚至無法儲存實際並不長的string物件。如在有16位int型的機器上,int型別變數最大只能表示32767個字元的string物件。而能容納乙個檔案內容的string物件輕易就能超過這個數字,因此,為了避免溢位,儲存乙個string物件的size的最安全的方法就是使用標準庫型別string::size_type().
一點注意:雖然是在學習標準庫string的時候巧遇了size_type型別,但是,其實vector庫也可以定義size_type型別,在vector庫中還有乙個difference_type型別,該型別用來儲存任何兩個迭代器物件間的距離,所以是signed型別的。
友情提示,還有乙個size_t:
什麼是size_t型別呢?其實本質上和size_type沒有多大區別
其實size_t和size_type類似,size_t 型別定義在cstddef標頭檔案中,該檔案是c標準庫的標頭檔案stddef.h的c++版本.它是乙個與機器相關的unsigned型別,其大小足以保證儲存記憶體中物件的大小。用法如下:
bitset<32> bitvec;
size_t sz=bitvec.size();
另外sizeof操作符的返回值的型別也為size_t哦
帶符號整數的除法與餘數
他的巧妙之處在於,用乙個對稱的 digits 陣列搞定了負數轉換的邊界條件 二進位制補碼的正負整數表示範圍不對稱 大致如下,經過改寫 c sharp view plain copy const char convert char buf,int value static const char zer...
關於有符號與無符號的位元組
經歷過幾個時期,一直都用無符串的,總感覺有乙個符號位非常的不靠譜,編譯器什麼時候給你轉一下型別,或者幹了什麼 後來又覺得c嘛,不會管你的到底是 1 還是255,反正都一樣,什麼型別啊,都是浮動,不就是一段記憶體長這樣嘛 後來又變了,覺得unsigned char真是麻煩,還得這麼長或者typedef...
無符號數與有符號數的操作
void sum void 當混合不同型別的變數進行計算時,便可能會發生型別轉換 相同型別的資料在轉換時有規則可循 字元必須先轉換為整數 c語言規定字元型別資料和整型資料之間可以通用 short型轉換為int型 同屬於整型 float型資料在運算時一律轉換為雙精度 double 型,以提高運算精度 ...