2011-12-03 28 views
5
#include <iostream> 
#include <stdlib.h> 

int main(int argc, char *argv[]) 
{ 

    int num=-2147483648; 
    int positivenum=-num; 
    int absval=abs(num); 

    std::cout<<positivenum<<"\n"; 
    std::cout<<absval<<"\n"; 

    return 0; 
} 

Hi tôi khá tò mò tại sao đầu ra của các mã trên làPhủ định của -2147483648 không thể có trong C/C++?

-2147483648 
-2147483648 

Bây giờ tôi biết rằng -2147483648 là số nhỏ nhất trong số represntable ints ký, (giả sử một int là 32 bit). Tôi đã giả định rằng người ta sẽ nhận được câu trả lời rác chỉ sau khi chúng tôi đã đi dưới số này. Nhưng trong trường hợp này, +2147483648 IS được bao phủ bởi hệ thống 32 bit của các số nguyên. Vậy tại sao câu trả lời tiêu cực trong cả hai trường hợp?

+0

Sử dụng _int64 thay vì int và thử lại. – jmucchiello

Trả lời

15

Nhưng trong trường hợp này, +2147483648 IS được bao gồm bởi hệ thống 32 bit của số nguyên.

Không hoàn toàn chính xác. Nó chỉ lên tới +2147483647. Giả sử của bạn không đúng.

Phủ nhận -2147483648 thực sự sẽ sản xuất 2147483648, nhưng nó sẽ tràn ngược trở lại -2147483648.

Ngoài ra, tràn số nguyên đã ký là hành vi không xác định về mặt kỹ thuật.

7

Giá trị - (- 2147483648) là không phải là có thể trong int 32 bit đã ký. Phạm vi của 32 bit int đã ký là –2147483648 đến 2147483647

+0

darn Tôi sẽ trả lời, nhưng +1 – tekknolagi

2

Ahhh, nhưng nó không ... nhớ 0, lớn nhất ký kết thực sự là 2147483647

1

Bởi vì đại diện bổ sung của 2 số nguyên ký là không đối xứng và 32-bit số nguyên ký tối thiểu là -2147483648 trong khi tối đa là +2147483647. Điều đó-2147483648 là đối tác của chính nó giống như 0 là (trong đại diện bổ sung của 2 chỉ có một 0, không có khác biệt +0 và -0).

Dưới đây là một số giải thích.

Một số âm -X khi được biểu diễn dưới dạng bổ sung của N-bit 2, được biểu thị một cách hiệu quả dưới dạng số không dấu bằng 2 N -X. Vì vậy, đối với số nguyên 32-bit:
nếu X = 1, sau đó -X = 2 -1 = 4294967295
nếu X = 2147483647, sau đó -X = 2 -2147483647 = 2147483649
nếu X = 2147483648, sau đó -X = 2 -2147483648 = 2147483648
nếu X = -2147483648, sau đó -X = 2 + 2147483648 = 2147483648 (vì chúng tôi chỉ giữ thấp 32 bit)

vì vậy, -2147483648 = +2147483648. Chào mừng bạn đến với thế giới của các giá trị bổ sung của 2.

Các vấn đề liên quan