論無符號與帶符號的差別,逆轉字串帶來的啟示

2021-08-02 11:06:15 字數 1988 閱讀 2142

沒事寫了一下逆轉字串,當然這本來就是很簡單的**,**如下:

#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 型,以提高運算精度 ...