[英]For what two int values does x = -x?
我正在參加C ++編程課程,並且正在參加實踐考試。 問題之一是“在標准數學中,0是x = -x的唯一值。但是,在C中,有兩個這樣的值。它們是什么?”
我知道其中一個是0。另一個可能是什么? 最低的負數? 謝謝!
但是,在C中有兩個這樣的值。 這些是什么?
這個說法是錯誤的。
對於int
值,唯一的值x == -x
是x = 0
。
-INT_MIN
無法調用,因為-INT_MIN
調用未定義的行為。
請注意,對於浮點(IEEE-754),有兩個不同的值0.0
, +0.0
和-0.0
和此表達產率1
:
0.0 == -0.0
這兩個值(至少在我的機器上)為: -2147483648
和0
。
這可以通過一個小的測試程序來證明:
#include <limits.h>
#include <stdio.h>
int main(){
int i;
for (i = INT_MIN; i < INT_MAX; i++) {
if (i == -i) printf("%d\n", i);
}
return 0;
}
范圍中最小數字的二進制補碼將不會具有取反數字的預期效果。 例如,在8位系統中,−128的二進制補碼導致相同的二進制數。 這是因為不能用8位帶符號的二進制數表示正值128。
但是,正如其他人提到的那樣,此行為可能與平台和體系結構有關。 它可能對教育有用,但我不會編寫依賴於任何這種行為的程序。
C允許三種帶符號整數編碼:
盡管除了最深奧或最古老的建築之外,所有建築都使用二進制補碼( 相關問題 )。
舉一個2位整數范圍-2到1的簡化示例。要更改二進制補碼中的符號,請反轉這些位並加一個。 所以:
n invert +1(-n)
00 11 00 --- 0 == -0
01 10 11
10 01 10 --- -2 == -2
11 00 01
作為補充,簡單地將位反轉,並且將行數設為-1至+1。
n invert(-n)
00 11
01 10
10 01
11 00
這里有兩種零編碼(-0和+0),因此沒有n == -n的值
在符號/幅度中,符號位改變:
n !sign(-n)
00 10
01 11
10 00
11 01
再次沒有n == -n的值(也有兩種編碼為零)。
這取決於架構。 如果將負數表示為2的補數,則最小數將符合x==-x
。 除此之外,您有零。
的確,在c中有兩個數字x ==-x。 一個是0 ==-0(整數)。 第二個是0.0 ==-0.0(浮點值)。 在c中,整數和浮點值不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.