我注意到,對於8位變量的簡單操作,變量在操作完成之前轉換爲32位int
s,然後轉換回8位變量。爲什麼uint8_t + uint8_t會導致int?
作爲一個例子,這個C++程序:
#include <iostream>
#include <cstdint>
int main(void)
{
uint8_t a = 1;
uint8_t b = 2;
std::cout << "sizeof(a) = " << sizeof(a) << std::endl;
std::cout << "sizeof(b) = " << sizeof(b) << std::endl;
std::cout << "sizeof(a+b) = " << sizeof(a+b) << std::endl;
return 0;
}
產生以下輸出:
sizeof(a) = 1
sizeof(b) = 1
sizeof(a+b) = 4
因此,我們可以明白,什麼情況是:
uint8_t c = (uint8_t)((int)(a) + (int)(b));
顯然,這似乎是在this論壇中說的C規範。
此外,在Visual Studio 2013,寫
auto c = a + b;
而超過c
將鼠標指針指示該類型是int
。
的問題是:
- 爲什麼轉換需要,爲什麼在規範呢? (如果可能,有了答案,我希望外部信息來源閱讀有關該主題的更多信息(如MSDN,cppreference)。)
- 這會如何影響性能?
* 「爲什麼轉換需要,爲什麼在規範呢?」 * – WhiZTiM
想象一下,你做'uint8_t A = 200,B = 100,C = 2; uint8_t d =(a + b)/ c;'沒有升級,中間結果會溢出 - 隨着升級,所有內容都將以150爲最終目標。 –
@JesperJuhl *「..沒有提升中間結果會溢出」* - 'int a = INT_MAX,b = 343232;無論如何,int c = a + b'仍然會溢出...所以呢? – WhiZTiM