首页
/
每日頭條
/
科技
/
c語言中負數加負數怎麼求
c語言中負數加負數怎麼求
更新时间:2025-06-03 14:17:10

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

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
華為手機為什麼在休眠狀态下接收不到微信消息?
華為手機為什麼在休眠狀态下接收不到微信消息?
華為手機為什麼在休眠狀态下接收不到微信消息?可能是以下幾種情況:大部分應用需要聯網獲取推送消息,請确保手機網絡狀況良好:,我來為大家科普一下關于華為手機為什麼在休眠狀态下接收不到微信消息?下面希望有你要的答案,我們一起來看看吧!華為手機為什...
2025-06-03
三星3440ec筆記本拆機
三星3440ec筆記本拆機
作者:蘑菇愛上我夏天到了,溫度要上來了呼呼呼的筆記本散熱是否能頂住?墊瓶蓋?用散熱墊?用抽風機?不如拆機清灰換矽脂來的給力嘛我這裡有好多型号的拆機教程有需求可以評論嘛知無不言等我有時間卡片走起三星300E4C同學的電腦,平時喜歡玩lol,最...
2025-06-03
win10如何連接win7上的共享打印機
win10如何連接win7上的共享打印機
共享打印機是一種很常見的小型辦公環境下使用打印機的辦法。在我們日常辦公中,沒必要每一台電腦都配備一台打印機,可以把打印機所連接電腦作為主電腦後,其它電腦可通過局域網實行多台電腦打印機共享,如何設置打印機共享呢?1、我們首先在主機上安裝打印機...
2025-06-03
蘋果手機安裝哪個殺毒軟件比較好
蘋果手機安裝哪個殺毒軟件比較好
先來看一種略帶偏見或者略微偏頗的觀點。此觀點認為這正是iPhone系統的優越性,安卓系統就是無法比例的。iOS系統封閉安全這正是它的特點,也正是iPhone手機的逼格,所以根本不需要裝啥殺毒軟件,因為iPhone手機就不需要。再來看看事實。...
2025-06-03
手機号碼被運營商私自注銷
手機号碼被運營商私自注銷
前幾天,聯通放了個大招,聯合中國信息通信研究院号碼服務推進組和部分互聯網企業,推出了一個新服務——互聯網賬号清理服務,這個硬核服務的推出,将能輕松快速的解決許多人手機号碼被注冊的頭疼問題。要知道,手機莫名其妙被注冊,是一件非常令人郁悶的事,...
2025-06-03
Copyright 2023-2025 - www.tftnews.com All Rights Reserved