tft每日頭條

 > 科技

 > c語言中負數加負數怎麼求

c語言中負數加負數怎麼求

科技 更新时间:2025-03-04 15:59:06

c語言中負數加負數怎麼求?筆者在大學裡學習“計算機基礎”這門課的時候,被原碼、反碼和補碼這些概念搞得是暈頭轉向,最終也是似懂非懂,現在小編就來說說關于c語言中負數加負數怎麼求?下面内容希望能幫助到你,我們來一起看看吧!

c語言中負數加負數怎麼求(代碼幫助理解負數在計算機中的表示)1

c語言中負數加負數怎麼求

筆者在大學裡學習“計算機基礎”這門課的時候,被原碼、反碼和補碼這些概念搞得是暈頭轉向,最終也是似懂非懂。

但是在學習程序設計的時候,算是把負的整數在計算機中怎麼表示搞清楚了

其實沒那麼複雜,隻要記住這麼幾條就可以了:

将最左邊的位(最高位) 看作“符号位”。

  • 符号位為0 ,則表示是非負數,其絕對值就是除符号位以外的部分;
  • 符号位為1 ,則表示是負數,其絕對值是所有位取反(0 變 1, 1 變 0 )後再加 1 。

将一個負整數表示為二進制的方法:

  • 設置符号位為 1,其餘位等于絕對值取反再加 1

給定一個負整數的二進制表示形式,求該負整數:

  • 該負整數的絕對值是其二進制表示形式取反再加1

( 取反加 1 後的結果要看作是正數)。

用下面這段C 代碼來進一步幫助理解:

int的長度是4個字節,

也就是32個二進制位,

用十六進制表示就是8個十六進制數(每個十六進制數可以表示4個二進制位)

最左邊的位是符号位,右邊的31位是整數的數值,

所以整數int的範圍就是 -2^31 ~ (2^31-1)

如果32個位都是1, 也就是十六進制FFFFFFFF (8個F),換算到十進制是多少呢?

  • 套用上邊的方法,第一個位是1,說明是負數;
  • 後邊的二進制位都是1 (F對應1111),取反後都是0,然後加1,就是1,也就是說絕對值是1;
  • 所以8個F對應的十進制就是 -1

同理,一個1後邊跟者31個0,也就是十六進制80000000,對應的十進制是多少呢?

  • 第一個位是1,說明是負數;
  • 絕對值是(31個0取反 1),就是31個1 1,得到1後邊跟31個0,就是2^31;
  • 所以就是 -2^31= -2147483648

還有一個有趣的事情,就是溢出,英文叫 overflow

int變量對應的最大的數是,二進制0後邊跟着31個1,對應十進制的2^31-1=2147483647

對應的十六進制數是,第一個數0111也就7,後邊跟着7個F;

十六進制7FFFFFFF 1 是多少呢?

  • 用二進制加一下就是1後邊跟着31個0,
  • 也就是我們上邊計算過的80000000,也就是十進制的-2147483648

參考代碼中也調用了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每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved