簡體   English   中英

將unsigned [char,short,int,long]轉換為double的結果不一致

[英]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更窄的類型被提升為intunsigned int

由於(signed) int可以包含可以由unsigned char表示的所有值,因此值(unsigned char)10將被提升為signed int10 否定為您提供(簽名) 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位longunsigned long )。 將該值轉換為double會失去一些精度,從而產生您看到的值。

除了促銷規則之外,重要的是要記住C表達式的類型(幾乎總是)不受其出現的上下文的影響。 -f產生相同值和類型的結果,而不管它分配給什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM