簡體   English   中英

x = -x是什么兩個int值?

[英]For what two int values does x = -x?

我正在參加C ++編程課程,並且正在參加實踐考試。 問題之一是“在標准數學中,0是x = -x的唯一值。但是,在C中,有兩個這樣的值。它們是什么?”

我知道其中一個是0。另一個可能是什么? 最低的負數? 謝謝!

但是,在C中有兩個這樣的值。 這些是什么?

這個說法是錯誤的。

對於int值,唯一的值x == -xx = 0

-INT_MIN無法調用,因為-INT_MIN調用未定義的行為。

請注意,對於浮點(IEEE-754),有兩個不同的值0.0+0.0-0.0和此表達產率1

 0.0 == -0.0

這兩個值(至少在我的機器上)為: -21474836480

這可以通過一個小的測試程序來證明:

#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.

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