[英]Inconsistent results converting unsigned [char, short, int, long] to double
#include <stdio.h>
int main(int argc, char* argv[]) {
unsigned char c = 10;
unsigned short d = 10;
unsigned int e = 10;
unsigned long f = 10;
double g = -c;
double h = -d;
double i = -e;
double j = -f;
printf("%d %lf\n", c, g);
printf("%u %lf\n", d, h);
printf("%u %lf\n", e, i);
printf("%lu %lf\n", f, j);
}
給出輸出
10 -10.000000
10 -10.000000
10 4294967286.000000
10 18446744073709551616.000000
為什么結果不一致,某些類型產生-10,而其他類型產生巨大價值?
一元的操作-
操作員晉升 ; 比int
更窄的類型被提升為int
或unsigned int
。
由於(signed) int
可以包含可以由unsigned char
表示的所有值,因此值(unsigned char)10
將被提升為signed int
值10
。 否定為您提供(簽名) int
值-10
,然后將其轉換為double
。
unsigned int
不會“提升”為int
,因為int
不能保存所有值。 所以表達式-e
應用unsigned int
negation運算符,顯然不能產生負值。 結果是UINT_MAX + 1 - 10
,在您的系統上是4294967286
。 轉換為double
產生您看到的值。
同樣, unsigned long
提升unsigned long
,因此-f
產生ULONG_MAX + 1 - 10
,當轉換為double
產生18446744073709551606
(2 64 -10)(顯然你的系統有64位long
和unsigned long
)。 將該值轉換為double
會失去一些精度,從而產生您看到的值。
除了促銷規則之外,重要的是要記住C表達式的類型(幾乎總是)不受其出現的上下文的影響。 -f
產生相同值和類型的結果,而不管它分配給什么。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.