c語言中負數加負數怎麼求?筆者在大學裡學習“計算機基礎”這門課的時候,被原碼、反碼和補碼這些概念搞得是暈頭轉向,最終也是似懂非懂,現在小編就來說說關于c語言中負數加負數怎麼求?下面内容希望能幫助到你,我們來一起看看吧!
筆者在大學裡學習“計算機基礎”這門課的時候,被原碼、反碼和補碼這些概念搞得是暈頭轉向,最終也是似懂非懂。
但是在學習程序設計的時候,算是把負的整數在計算機中怎麼表示搞清楚了
其實沒那麼複雜,隻要記住這麼幾條就可以了:
将最左邊的位(最高位) 看作“符号位”。
将一個負整數表示為二進制的方法:
給定一個負整數的二進制表示形式,求該負整數:
( 取反加 1 後的結果要看作是正數)。
用下面這段C 代碼來進一步幫助理解:
int的長度是4個字節,
也就是32個二進制位,
用十六進制表示就是8個十六進制數(每個十六進制數可以表示4個二進制位)
最左邊的位是符号位,右邊的31位是整數的數值,
所以整數int的範圍就是 -2^31 ~ (2^31-1)
如果32個位都是1, 也就是十六進制FFFFFFFF (8個F),換算到十進制是多少呢?
同理,一個1後邊跟者31個0,也就是十六進制80000000,對應的十進制是多少呢?
還有一個有趣的事情,就是溢出,英文叫 overflow
int變量對應的最大的數是,二進制0後邊跟着31個1,對應十進制的2^31-1=2147483647;
對應的十六進制數是,第一個數0111也就7,後邊跟着7個F;
十六進制7FFFFFFF 1 是多少呢?
參考代碼中也調用了c語言庫函數cmath來計算2^31次方,然後進行類型轉換,來進一步幫助理解二進制數所表示的十進制整數,就不多解釋了,看看代碼應該可以搞明白在做什麼
參考代碼:
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int main ()
{
int a = 0xFFFFFFFF ; // -1
int b = 0x80000000 ; // -2^31
int c = 0x80000001 ; // -(2^31 -1)
int d = abs(c) ; // max positive, 2^31 -1
int e = d 1 ; // max positive (2^31 -1) 1 will overflow, result is -(2^31)
printf("hexadecimal : decimal \n") ;
printf("%x :%d\n", a, a) ;
printf("%x :%d\n", b, b) ;
printf("%x :%d\n", c, c) ;
printf("%x :%d\n", d, d) ;
printf("%x :%d\n", e, e) ;
printf("-------------------------------------------\n") ;
//
double mm = pow (2.0, 31.0) ; // cmath lib 2^31
printf("double 2^31 = %lf\n", mm) ;
long long m = (long long) mm ;
printf("long long 2^31 = %ld\n", m) ;
int n = (int) m;
printf("int 2^31 = %d because of overflow\n", n) ;
--m ;
n = (int) m;
printf("int (2^31 -1) = %d\n", n) ;
m = (long long) mm ;
m = 0 - m ;
printf("long long (-2^31) = %ld\n", m) ;
n = (int) m;
printf("int (-2^31 ) = %d no overflow\n", n) ;
return 0 ;
}
輸出結果:
hexadecimal : decimal
ffffffff :-1
80000000 :-2147483648
80000001 :-2147483647
7fffffff :2147483647
80000000 :-2147483648
-------------------------------------------
double 2^31 = 2147483648.000000
long long 2^31 = 2147483648
int 2^31 = -2147483648 because of overflow
int (2^31 -1) = 2147483647
long long (-2^31) = -2147483648
int (-2^31 ) = -2147483648 no overflow
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!