我不允許使用 abs 或任何其他庫。這是我到目前為止所嘗試的。
#include <stdio.h>
#include <limits.h>
int main()
{
int n = INT_MIN;
if (n == INT_MIN)
{
int a = -n;
a = n % 10;
putchar(a '0');
}
return (0);
}
輸出總是“(”而不是正確答案。
uj5u.com熱心網友回復:
首先將模數應用于負數以獲得單個負數。否定那個。
#include <stdio.h>
#include <limits.h>
int main()
{
int n = INT_MIN;
int a = -( n % 10);
putchar(a '0');
return (0);
}
uj5u.com熱心網友回復:
什么時候n == INT_MIN
,不要使用a = -n
,因為那是未定義的行為(UB),因為-n
溢位了int
數學。
使用a = n
將產生一些值 [-9 ... 0],因為n < 0
. a
在使用它列印數字之前無需否定,只需減去。
int n = INT_MIN;
int a = n%10;
putchar('0' - a);
要列印整個int
,請注意負值多于[INT_MIN ... -1]
正值[1 ... INT_MAX]
*1。與其將負數否定為正數(并讓 UB 帶有INT_MIN
),不如將正數否定為負數。
#include <limits.h>
#include <stdio.h>
...
int n = {some value from INT_MIN to INT_MAX};
int a = n < 0 ? n : -n;
char buf[21];
char *p = buf sizeof buf - 1;
*p = '\0';
do {
p--;
*p = '0' - a%10;
a /= 10;
} while (a);
if (n < 0) {
*--p = '-';
}
puts(p);
即使int
我們使用long long
or代替 ,這種方法也有效intmax_t
。我們只需要調整緩沖區長度。 char buf[21]
對于 64 位整數來說足夠大。
*1使用常見的 2 的補碼整數編碼,總有一個負數。對于罕見的 1 補碼和符號幅度編碼,可能會在 C2x 中被丟棄,但情況相同。當然,這些可能有 0和-0,但讓我們將其留給歷史編程。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/507317.html
標籤:C