#include <stdio.h>
int main()
{
char a = 0, b = 0, total = 0;
a = 120;
b = 9;
total = a b;
printf("The sum of two numbers are: %d\n", a b); // 129
printf("The sum of two numbers are: %d\n", total); // -127
return 0;
}
129 的值不正確。我知道它與 printf 函式有關,但不知道為什么/如何。-127 的值是正確的,因為總共發生了溢位。
uj5u.com熱心網友回復:
129 的值不正確。我知道它與 printf 函式有關,但不知道為什么/如何。
不,它沒有錯,它與printf.
在 中printf("The sum of two numbers are: %d\n", a b);, 的運算元 服從C 2018 6.3.1.8 中定義的常用算術轉換。這些轉換包括整數提升,它將char操作int數轉換為普通 C 實作中的運算元。
因此, in a b、a轉換為int、b轉換為int,并將它們的值相加以產生int結果。結果是 129,它被列印出來。
-127 的值是正確的,因為總共發生了溢位。
當溢位發生時,C 標準沒有定義行為,因此任何結果都是“正確的”,因為它在 C 標準允許的范圍內。此外,沒有任何結果(來自程式終止)或任何其他行為(例如破壞程式的其他部分)在同一意義上是“正確的”。
但是,這里沒有發生溢位。與printf、 in total = a b;、a和b轉換為int然后相加,結果再次為 129。然后將 129 分配給total。由于total是 a char,并且char您的 C 實作中的最大值是 127,因此轉換會更改該值。C 2018 6.3.1.3 3 說結果要么是實作定義的,要么是引發了信號。您的 C 實作顯然將結果以 256 為模進行包裝,因此 129 變為 129?256 = ?127。(例如,GCC 記錄了這就是它所做的。)
然后printf("The sum of two numbers are: %d\n", total);將 -127 傳遞給printf,這當然會列印“-127”。
uj5u.com熱心網友回復:
在第一種情況下,a和b被轉換為int然后添加。結果129符合int
第二種情況加法的結果不適合char. 我相信實作定義的行為。在這種情況下129,二進制補碼 8 位格式是-127.
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/364035.html
標籤:C
下一篇:宣告矩陣c的不同方式
