C ++ 11 menambahkan beberapa fungsi konversi string baru:
http://en.cppreference.com/w/cpp/string/basic_string/stoul
Ini termasuk stoi (string ke int), stol (string ke long), stoll (string ke long long), stoul (string ke unsigned long), stoull (string ke unsigned long long). Terkemuka dalam ketidakhadirannya adalah fungsi stou (string to unsigned). Adakah alasan mengapa hal itu tidak diperlukan tetapi yang lainnya ada?
related: Tidak ada fungsi "sto {short, unsigned short}" di C ++ 11?
unsigned long
just is nounsigned int
.unsigned long
adalah 64 bit, danunsigned int
32. Mereka adalah tipe yang berbeda, dan tidak dapat diasumsikan sama satu sama lain.stou
pertanyaan "Wah wah, di mana itu sialan ", tetapi pertanyaan yang menanyakan kemungkinan alasan yang pasti untuk ketidakkonsistenan yang jelas ini. Jika Anda tahu tidak ada alasan seperti itu, maka postinglah sebagai jawaban.Jawaban:
Jawaban yang paling tepat adalah bahwa pustaka C tidak memiliki "
strtou
" yang sesuai , dan fungsi string C ++ 11 semuanya terselubung tipis di sekitar fungsi pustaka C:std::sto*
Fungsi cerminstrto*
, danstd::to_string
fungsi yang digunakansprintf
.Sunting: Seperti yang ditunjukkan KennyTM, keduanya
stoi
danstol
digunakanstrtol
sebagai fungsi konversi yang mendasarinya, tetapi masih misterius mengapa sementara adastoul
yang menggunakanstrtoul
, tidak ada yang sesuaistou
.sumber
boost::lexical_cast<>()
sepertinya lebih seperti cara C ++ dalam melakukan sesuatu.sto*
, C ++ 11 21.5 / 1: Effects: dua fungsi pertama memanggil strtol (str.c_str (), ptr, base), dan tiga fungsi terakhir memanggil strtoul (str.c_str (), ptr, base ), strtoll (str.c_str (), ptr, base), dan strtoull (str.c_str (), ptr, base), masing-masing.std::sto*
harus diimplementasikan sebagai pembungkus untuk fungsi pustaka C, dan program yang valid tidak dapat mengatakan bahwa mereka tidak diam-diam diimplementasikan secara berbeda, implementasinya valid.Saya tidak tahu mengapa
stoi
ada tetapi tidakstou
, tetapi satu-satunya perbedaan antarastoul
dan hipotesisstou
adalah pemeriksaan bahwa hasilnya berada dalam kisaranunsigned
:(Demikian pula,
stoi
juga mirip denganstol
, hanya dengan pemeriksaan rentang yang berbeda; tetapi karena sudah ada, tidak perlu khawatir tentang cara tepat menerapkannya.)sumber
stoi
danstol
, ataustol
danstoll
juga hanya merupakan pemeriksaan rentang.stoi
danstol
, ya. Tapistol
danstoll
tidak hanya berbeda dalam pemeriksaan jangkauan, mereka memanggil fungsi perpustakaan yang berbeda.Menggunakan mask untuk melakukan ini dengan ukuran nilai yang diharapkan dalam bit yang diekspresikan dalam mask, akan membuat ini berfungsi untuk int 64-bit vs 32-bit, tetapi juga untuk panjang 32-bit vs int 32-bit.
Dalam kasus panjang 64-bit, ~ 0xffffffffl akan menjadi 0xffffffff00000000 dan dengan demikian akan melihat apakah ada dari 32 bit teratas yang disetel. Dengan panjang 32-bit, ~ 0xffffffffl menjadi 0x00000000 dan pemeriksaan topeng akan selalu nol.
sumber