當前位置:首頁 » 編程語言 » c語言求二進制補碼
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言求二進制補碼

發布時間: 2023-01-14 00:35:58

『壹』 c語言求二進制補碼 源代碼

輸入任意整數,輸出32位的補碼。
輸入其他,結束程序。

#include<stdio.h>
int main()
{
int i,num=0;
char s[33]={0};
while(1==scanf("%d",&num)){
for(i=0;i<32;i++){
s[i]= (0x01 & (num>>(31-i))) ? '1' : '0' ;
}
printf("%s\n",s);
}
return 0;
}

『貳』 C語言中二進制求補碼過程中取反後再加1,那個1是怎麼加的跪求!

可以通過如下2個實例來看看二進制中求補碼的過程。

實例1:求5的補碼
說明:對於正數,其源碼、反碼和補碼均相同。
5的源碼:0000 0101
5的反碼:0000 0101
5的補碼:0000 0101

實例1:求-5的補碼
說明:對於負數,其反碼是源碼各位取反(不包括符號位),其補碼是反碼加1。
-5的源碼:1000 0101
-5的反碼:1111 1010 (源碼的各位取反,不包括符號位(最高位))
-5的補碼:1111 1011 (反碼加1,即在最低位加1)

『叄』 C語言編程之二進制原碼、反碼和補碼

概述

在計算機內,有符號數有3種表示法:原碼、反碼和補碼。

在計算機中,數據是以補碼的形式存儲的,所以補碼在c語言的教學中有比較重要的地位,而講解補碼必須涉及到原碼、反碼。

詳細釋義

所謂原碼就是二進制定點表示法,即最高位為符號位,「0」表示正,「1」表示負,其餘位表示數值的大小。

反碼表示法規定:正數的反碼與其原碼相同;負數的反碼是對其原碼逐位取反,但符號位除外。

補碼表示法規定:正數的補碼與其原碼相同;負數的補碼是在其反碼的末位加1。

原碼、反碼和補碼的表示方法

定點整數表示法

定點小數小時法

反碼

正數:正數的反碼與原碼相同。

負數:負數的反碼,符號位為「1」,數值部分按位取反。

例如: 符號位 數值位

[+7]反= 0 0000111 B

[-7]反= 1 1111000 B

注意:

a. 數0的反碼也有兩種形式,即

[+0]反=00000000B

[- 0]反=11111111B

b. 8位二進制反碼的表示範圍:-127~+127

原碼

在數值前直接加一符號位的表示法。

例如: 符號位 數值位

[+7]原= 0 0000111 B

[-7]原= 1 0000111 B

注意:

數0的原碼有兩種形式:

[+0]原= 00000000B

[-0]原= 10000000B

位二進制原碼的表示範圍:-127~+127

補碼

1)模的概念:把一個計量單位稱之為模或模數。

例如,時鍾是以12進制進行計數循環的,即以12為模。在時鍾上,時針加上(正撥)12的整數位或減去(反撥)12的整數位,時針的位置不變。

對於一個模數為12的循環系統來說,加2和減10的效果是一樣的;因此,在以12為模的系統中,凡是減10的運算都可以用加2來代替,這就把減法問題轉化成加法問題了(註:計算機的硬體結構中只有加法器,所以大部分的運算都必須最終轉換為加法)。

10和2對模12而言互為補數。

同理,計算機的運算部件與寄存器都有一定字長的限制(假設字長為8),因此它的運算也是一種模運算。當計數器計滿8位也就是256個數後會產生溢出,又從頭開始計數。產生溢出的量就是計數器的模,顯然,8位二進制數,它的模數為2^8=256。在計算中,兩個互補的數稱為「補碼」。

2)補碼的表示:

正數:正數的補碼和原碼相同。

負數:負數的補碼則是符號位為「1」。並且,這個「1」既是符號位,也是數值位。數值部分按位取反後再在末位(最低位)加1。也就是「反碼+1」。

例如: 符號位 數值位

[+7]補= 0 0000111 B

[-7]補= 1 1111001 B

補碼在微型機中是一種重要的編碼形式,請注意:

a. 採用補碼後,可以方便地將減法運算轉化成加法運算,運算過程得到簡化。

正數的補碼即是它所表示的數的真值,而負數的補碼的數值部份卻不是它所表示的數的真值。

採用補碼進行運算,所得結果仍為補碼。

b. 與原碼、反碼不同,數值0的補碼只有一個,即

[0]補=00000000B。

若字長為8位,則補碼所表示的范圍為-128~+127;進行補碼運算時,應注意所得結果不應超過補碼所能表示數的范圍。

原碼、反碼和補碼之間的轉換

由於正數的原碼、補碼、反碼表示方法均相同,不需轉換。

在此,僅以負數情況分析。

(1) 已知原碼,求補碼。

例:已知某數X的原碼為10110100B,試求X的補碼和反碼

解:由[X]原=10110100B知,X為負數。求其反碼時,符號位不變,數值部分按位求反;求其補碼時,再在其反碼的末位加1。

1 0 1 1 0 1 0 0 原碼

1 1 0 0 1 0 1 1 反碼,符號位不變,數值位取反

1 1 0 0 1 1 0 0 補碼,符號位不變,數值位取反+1

故:[X]補=11001100B,[X]反=11001011B。

(2) 已知補碼,求原碼。

分析:按照求負數補碼的逆過程,數值部分應是最低位減1,然後取反。但是對二進制數來說,先減1後取反和先取反後加1得到的結果是一樣的,故仍可採用取反加1 有方法。

例:已知某數X的補碼11101110B,試求其原碼。

解:由[X]補=11101110B知,X為負數。

1 1 1 0 1 1 1 0 補碼

1 1 1 0 1 1 0 1 反碼(符號位不變,數值位取反加1)

1 0 0 1 0 0 1 0 原碼(符號位不變,數值位取反)

關於補碼的補充例子:

一個正的整數的補碼就是這個整數變成二進制的值。

舉例:一個int型變數i=10,其二進制補碼就是0000 0000 0000 0000 0000 0000 0000 1010(0x0000000A)

2. 一個負整數的二進制補碼,就是該負數的絕對值所對應的補碼全部取反後加1.

舉例:int i=-10的補碼如何求得:

先求-10的絕對值10的補碼是0000 0000 0000 0000 0000 0000 0000 1010(0x0000000A);

再將求得的補碼取反: 1111 1111 1111 1111 1111 1111 1111 0101

再將取反後得到的補碼加1: 1111 1111 1111 1111 1111 1111 1111 0101 + 1

即可得到-10的二進制補碼: 1111 1111 1111 1111 1111 1111 1111 0110(0xFFFFFFF6)

3. +0和-0的二進制補碼都是0

首先+0的二進制補碼是0;

-0的二進制補碼是+0的二進制補碼取反後加1,+0的二進制補碼為0,取反後為FFFFFFFF,加1後還是0

原碼和反碼在數值0都有二意,唯有補碼在數值0是唯一的碼值!

『肆』 c語言中補碼怎麼算的


首先建議樓主去惡補一下「原碼」、「反碼」以及「補碼」的相關知識。

以下我就先來分析一下(假設你已經了解了這些知識):

首先我們以無符號的視點來看待題目中的數據:

n = 0x7FFF
m = 0x8000

可知對於n來說,他的二進制模式為:0111 1111 1111 1111
對於m來說,他的二進制模式為: 1000 0000 0000 0000
可以看到,最高位符號位n為0,而m為1
所以用帶符號數的視角來看待m、n的這串二進制數據,我們知道n符號位(最高位)為零,所以n是正數,而m符號位為1,因而是負數。

對於補碼,正數好計算,就是他的值,也就是0111 1111 1111 1111 = 0x7FFF = 32767

對於負數m,為了知道他的值我們可以這么干:
假設m的絕對值|m| = x,則我們對m就可以得到x
m = 1000 0000 0000 0000
取反:
~m = 0111 1111 1111 1111
加1
~m + 1 = 1000 0000 0000 0000
(這道題數據比較特殊,所以你看到m和~m+1結果貌似一樣,事實上你可以列舉其他值算算,一般這兩個位模式是不同的)
可知x = 32768
則可知m = -x = -32768

以上

『伍』 c語言中的二進制補碼

(1)正數的補碼:與原碼相同。
(2)負數的補碼:符號位為1,其餘位為該數絕對值的原碼按位取反;然後整個數加1。

『陸』 C語言的補碼是怎樣求出來的

正數是取原碼,負數是對應正數逐位取反再加一
比如19,原碼用8位二進制是00010011,那麼它的補碼、反碼都是00010011。
而對於-19,因為19的8 位原碼是00010011,逐位取反得
11101100,再加1,11101101
所以-19的原碼是10010011,反碼是11101100,補碼是11101101

『柒』 c語言遞歸函數 輸出十進制數的二進制的補碼,怎麼寫

如果是正數,補碼=原碼,如果是負數,x = x + 1 + 0xffffffff,再對x求原碼
scanf("%d", &x);
x = (x + 1 + 0xffffffff) % 0xffffffff;
//TODO...再對x求原碼就行
//這里0xFFFFFFFF為int能表示的最大值,如果int佔4個位元組的話,一般都是4個位元組

『捌』 c語言中二進制補碼問題

32767=2的15次方-1 = 01111111 11111111 你怎麼得來的「原碼是1100000000001001」??
原碼:人為規定的一種數據概念,最高位為符號位,其餘位為數值位,實際應用中不用
反碼:也是人為規定的數據概念,正數原碼即是反碼,負數反碼:符號位不動,數值位按位取反,實際應用中不用
補碼:計算機中實際存儲數據的格式,真正的數據應用。
正數的原碼即是補碼
負數的補碼是反碼+1

『玖』 c語言中-8的八位二進制補碼是多少

8的二進制碼:1000
8的8位二進制碼:0000 1000
反碼:1111 0111
加1:1111 1000
得到的就是-8的8位二進制補碼:
1111 1000
有什麼問題請留言。

『拾』 二進制補碼問題(C語言)

一樓說的不對,由原碼到補碼,再由補碼到原碼應該都是取反+1,不存在-1的情況。

1000,0000,0000,0000計算機會識別為負數(即先確定符號),接下來就是求其絕對值了,先取反0111,1111,1111,1111,再加1,得1000,0000,0000,0000,1後面有15個0,所以是2^15,即32768,帶上符號就是-32768.

不過根據你的程序,有些奇怪的是在vc環境中,int 是4位元組的有符號整型,32767+1是不會出現溢出的。
只是在有的變數為2位元組有符號時,范圍是-32768~32767,才會出現溢出。

補充:TC環境中定義的int位元組數與vc不同。上微機原理課的時候,老師說過是連符號位一起運算的。