C++ 表示式中的型別轉換
C++ 表示式中的型別轉換
簡介
最近刷題經常遇到對結果取模,由於某些操作導致溢位。例如 MOD = 10e9 + 7
下列表示式
int hash = (base * base) % MOD // base * base 溢位
需要在表示式中加入強制型別轉換。摘抄C++ Primer Plus 3.4.4 型別轉換章節之表示式中的轉換。
自動轉換
整形提升(integral promotion): C++ 在計算表示式時,自動將 bool
char
unsigned char
singed char
short
轉換為int
。 例如true->1
。由於int
是計算機最自然的型別,計算速度可能最快。
在表示式中,編譯器通過按順序查表進行轉換:
- 如果一個運算元型別是
long double
,將另一個運算元轉換為long double
- 否則,如果一個運算元是
double
,將另一個運算元轉換為double
- 否則,如果一個運算元是
float
,將另一個運算元轉換為float
- 否則,說明運算元都是整型,執行整型提升
- 兩個運算元均為有符號整型或者均為無符號整型,將級別低的轉換成級別高的型別
- 如果兩個運算元其中一個有符號整型另外一個無符號整型,且無符號整型級別比有符號運算元級別高,將有符號運算元轉換為無符號運算元所屬的型別
- 否則,如果有符號型別可表示無符號型別的所有可能取值,將無符號運算元轉換為有符號運算元所屬的型別
- 否則,將兩個運算元都轉換為有符號型別的無符號版本。
例如:對於 char + unsigned int
或者unsigned char + char
,執行4
對於6例如 unsigned long long + int
程式碼如下
#include <iostream>
#include <cmath>
#include <limits>
int main()
{
using namespace std;
cout << "size of int:" << sizeof(int) << endl;
cout << "size of unsigned long long:" << sizeof(unsigned long long) << endl;
int a = INT_MAX;
cout << "MAX " << INT_MAX << endl;
unsigned long long b = INT_MAX * 2ll; // 這裡用到了5
auto ret = a + b;
cout << ret << " " << sizeof(ret) << endl;
return 0;
}
/*
size of int:4
size of unsigned long long:8
MAX 2147483647
*/
對於7,例如long long + unsigned int
程式碼如下
#include <iostream>
#include <cmath>
#include <limits>
int main()
{
using namespace std;
cout << "size of unsigned int:" << sizeof(unsigned int) << endl;
cout << "size of long long:" << sizeof(long long) << endl;
unsigned int a = 0xffffffff; // unsigned 最大值
cout << "MAX " << a << endl;
long long b = INT_MAX * 2ll;
auto ret = a + b;
cout << ret << " " << sizeof(ret) << endl;
return 0;
}
/*
size of unsigned int:4
size of long long:8
MAX 4294967295
8589934589 8
*/
強制型別轉換
可以通過如下兩種方式實現
(typeName) value // (long long )1
typeName (value) // long long (1)
總結
顯然對於開始的例子,可以通過
using ll = long long;
int hash = ll(base) * base % MOD
解決
相關文章
- c++隱式型別轉換存在的陷阱C++型別
- C++型別轉換建構函式C++型別函式
- c++ 型別轉換C++型別
- 徹底理解c++的隱式型別轉換C++型別
- c++ static_cast顯式型別轉換C++AST型別
- C++ 常型別轉換C++型別
- 【C++】C++之型別轉換C++型別
- 聊聊 C++ 中的四種型別轉換符C++型別
- C++ 型別轉換(conv.)C++型別
- C++ 動態型別轉換C++型別
- C++強制型別轉換C++型別
- C++四種顯式型別轉換操作符C++型別
- java中的型別轉換Java型別
- C++整理18_型別轉換_C++型別
- C++ 重解釋型別轉換C++型別
- C C++ 強制型別轉換C++型別
- Java資料型別的顯式轉換和隱式轉換Java資料型別
- JavaScript隱式型別轉換JavaScript型別
- c++中幾種常見的型別轉換。int與string的轉換,float與string的轉換以及string和long型別之間的相互轉換。to_string函式的實現和應用。C++型別函式
- C語言的隱式型別轉換C語言型別
- java- 型別-轉換:基本型別以及包裝型別的轉換Java型別
- 教你如何在C++中實現中綴表示式轉字尾表示式C++
- 瞭解JavaScript中的型別轉換JavaScript型別
- 說說 Spring 表示式語言(SpEL)中的各種表示式型別Spring型別
- JavaScript 隱式資料型別轉換JavaScript資料型別
- 如何實現隱式型別轉換型別
- (譯)js中的神奇的型別轉換JS型別
- 型別轉換型別
- 建構函式定義的隱式型別轉換函式型別
- 從兩個小例子看js中的隱式型別轉換JS型別
- interface{} 型別的轉換型別
- golang的型別轉換Golang型別
- JS中資料型別轉換JS資料型別
- javascript中隱私型別轉換JavaScript型別
- 在 Shell 中轉換 Python 正規表示式Python
- JS在if中的強制型別轉換JS型別
- 沒有學不會的C++:使用者自定義的隱式型別轉換C++型別
- C++ const void * 型別轉換簡單測試C++型別