簡體   English   中英

這些變量是 C 語言中的哪些數據類型,我哪里錯了?

[英]What data types in C language are these variables and where I am wrong?

現在我正在學習C 語言,我有兩個任務。 定義變量並打印它們這是我的代碼:

    #include <stdio.h>

int main()
{
    printf("Excersise 1\n\n");
    int cVarOne = -250;
    int cVarTwo = 250;
    int cVarThree = 4589498;
    double cVarFour = 10000000000000000000;
    double cVarFive = -9000000000000000000;
    
    printf("%d\n%d\n%d\n%.0lf\n%.0lf\n\n", cVarOne,cVarTwo,cVarThree,cVarFour,cVarFive);
    
    printf("Excersise Two\n\n");
    unsigned short cVarSix = 43112;
    int cVarSeven = -1357674;
    int cVarEight = 1357674;
    int cVarNine = -1357674000;
    unsigned int cVarTen = 3657895000;

    printf("%u\n%d\n%d\n%d\n%lu\n", cVarSeven, cVarEight, cVarNine, cVarTen);
    return 0;
}

問題是練習 1 會出現以下消息:

練習 1

對於練習,兩個設置為變量的相同數字未正確打印。 這是結果:

練習 2

我嘗試使用不同的類型,但沒有結果。 我哪里錯了? 應該使用什么數據類型和說明符,為什么會出現這些錯誤?

我正在使用這個在線編譯器: https://www.onlinegdb.com/online_c_compiler

謝謝。

練習 2 中的警告是不言自明的,簡單地使用正確的 unsigned int 轉換說明符,如您最喜歡的 C 書籍的第 1 章所述。 這個答案的其余部分是關於練習 1:


為什么會收到警告:

整數常量,這些東西: 123 ,具有與變量一樣的類型。

10000000000000000000不是浮點類型,因為它不以. ( double ) 或.f (float),但是一個定點有符號整數。 編譯器將嘗試找到適合該值的最小有符號整數類型,但根本找不到。

原因是因為 10,000,000,000,000,000,000 = 10^19 大於最大的有符號 64 位整數,它只能容納 2^63 - 1 = 9.22*10^18 的值。

然而,編譯器注意到該值可能適合 64 位無符號整數,因為 2^64 -1 = 18.44*10^18,足夠大。 因此它會嘗試這樣做,但會警告您編寫這種臭代碼。


解決方案:

使用類型為double10000000000000000000.0
或者更好的是,使用10e18 ,它也是double的,但人類可讀。


一般最佳實踐:

  • 切勿在同一個表達式中混合浮點和定點。
  • 切勿在同一個表達式中混合使用floatdouble (在 PC 等大多數主流系統上完全避免float 。)
  • 當大小和可移植性很重要時,切勿使用 C 的默認整數類型,如intlong等。請改用stdint.h中的類型。

每個整數類型都有一個固定的字節大小,用於值的內部表示。 因此,可以以整數類型存儲的最大值和最小值存在限制。

例如對於uintmax_t類型,編譯器可以提供以下特征

#include <stdio.h>
#include <inttypes.h>

int main( void )
{
    uintmax_t x = UINTMAX_MAX;

    printf( "sizeof( uintmax_t ) = %zu and the maximum value is %"
            PRIuMAX "\n", sizeof( x ), x );

}

程序輸出為

sizeof( uintmax_t ) = 8 and the maximum value is 18446744073709551615

當您使用沒有像10000000000000000000這樣的后綴的整數常量時,編譯器會選擇可以表示此類常量的第一個有符號整數類型的常量類型。 但是,包括long long int在內的有符號整數類型都不能表示此常量。 因此編譯器會發出一條消息,即此類常量只能以無符號整數類型表示。

您可以使用帶有后綴的常量,例如

double cVarFour = 10000000000000000000llu;

后綴確定常量的類型為unsigned long long int

至於第二條消息,那么您必須使用帶有參數的正確轉換說明符。

轉換說明符lu旨在輸出unsigned long int類型的對象的值。 但是 printf 調用的相應參數

printf("%u\n%d\n%d\n%d\n%lu\n", cVarSeven, cVarEight, cVarNine, cVarTen);

具有unsigned int類型

unsigned int cVarTen = 3657895000;

所以要么使用u喜歡的轉換說明符

printf("%u\n%d\n%d\n%d\n%u\n", cVarSeven, cVarEight, cVarNine, cVarTen);

或將參數轉換為unsigned ling類型,如

printf("%u\n%d\n%d\n%d\n%lu\n", cVarSeven, cVarEight, cVarNine, ( unsigned long )cVarTen);

此格式規范%.0lf中的長度修飾符l也無效。 你可以寫%.0f

練習 1 中出現錯誤,因為您試圖以雙精度數據類型存儲 19 位數字,而它最多只能存儲 15 位數字

暫無
暫無

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

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