負整數在計算機內存中的存儲形式
A. 正數和負數在內存中是以什麼形式存儲的,都是補碼 為什麼呢
是以二進制方式儲存的,既補碼形式,正數前是0,負數前加1
B. c語言中,int類型的負整數在內存中以什麼存在
int類型的負整數在內存中以這個數的補碼形式存在。舉例說,-1,就是
11111111 11111111 11111111 11111111 (4位元組int)
C. 負整數賦值給無符號變數的結果及它們在內存中的表示形式
整型數據是帶符號數還是無符號數,其實在C語言中內部處理是沒有區別的,區別僅僅在於輸出的時候。
如果給的是帶符號數,那麼就存儲它的補碼示,否則存儲它的絕對數值對應的二進制值。
比如一個16位(二進制位數)整型數據在內存中是兩個位元組,它的每一位都是1。如果該數據定義時未使用unsigned,那麼它就是一個帶符號的整數,它的值就是-1;而如果該數據定義時使用了unsigned,那麼它就是一個帶符號的整數,它的值就是65535。
#include<stdio.h>
intmain(){
shorta;
unsignedshortb;
a=-1;
b=-1;
printf("a=%d,b=%d ",a,b);
a=65535;
b=65535;
printf("a=%d,b=%d ",a,b);
}
上面的代碼的輸出如下,說明不管你怎麼賦值,
a=-1,b=65535
a=-1,b=65535
D. 關於負整數在計算機的存放形式
比如說-1 我拿8位二進製做例 因為負數 所以第一位符號位為1 正數是0
所以[-1]原=1000 0001 按位取反 出符號位
[-1]反=1111 1110 加1
[-1]補=1111 1111 內存中就是這樣
返回輸出時 按反序求出源碼 就是減1 取反
E. 負數在內存中的二進制形式怎樣存儲
首先聲明在計算機中負數的存儲是採用二進制補碼的形式的;
以「-1」為例,32位為基礎:
「-1」的反碼為「1」,
1的二進制編碼為:00000000 00000000 00000000 00000001
取反: 11111111 11111111 11111111 11111110
加一: 11111111 11111111 11111111 11111111
F. 關於字元和整數在計算機內存中的存儲格式
字元類型的在內存中存儲形式是以相對應的ascll碼值的二進制存儲。
整數類型在內存中存儲所需的位元組根據系統位數和編譯器等因素決定,如果是存儲有符號數據的話,在內存中存儲的二進制數據可以說是它的補碼形式。正數的反碼、補碼是它自身,也就是存儲自身的二進制形式。負數在內存中的存儲形式是也是它的補碼。負數的補碼是它的反碼(首位符號位不變,其他位取反)+1。總之字元有字元在內存中的存儲,整數也有它相應在內存中的存儲形式。
G. 負數在計算機中以補碼形式存在么
計算機中,整型類數據都是用補碼來存儲的 如:char short int long都是 正數的補碼是自身 負數的補碼是原碼取反加1,在表現上會按負數輸出 但浮點型數據不同,它有自己的格式,浮點型數據是按IEEE754標准進行存儲的,詳情可查閱IEEE754標准
H. 整數,無符號整數和負數在內存中,以什麼形式存放
可以這樣想,所有的整數都是以補碼二進制形式存放的,但是正數的補碼是它本身,負數的補碼是對位取反末尾加一,無符號整數不需要存儲符號位,因此在正數范圍內存儲的范圍更大。
I. C語言中 負數在內存中為什麼要以補碼形式存儲
c的char數據屬於基本類型,基本類型其中還包括-整型,實型,枚舉類型!
數據在內存中是以二進制形式存放的。數值是以補碼表示的。
整型:
一個正數的補碼和其原碼的形式相同。而負數的補碼方式是將其絕對值的二進制形式「按位求反再加1」
實型:
在內存中佔4個位元組,是按照指數形式存儲的,實型數據分為小數部分和指數部分,分別存放!計算機用二進製表示小數部分,用2的冪次來表示指數部分!
字元型:
在內存中字元的存儲實際上是把字元相對應的ASCII代碼放到存儲單元中的。而這些ASCII代碼值在計算機中也是以二進制形式存放的。這個與整型的存儲很相似。因此這兩類之間的轉換也比較方便!
J. 計算機內存中整數的表示形式到底是哪一種
大家都知道數據在計算機中都是按位元組來儲存了,1個位元組等於8位(1Byte=8bit),而計算機只能識別0和1這兩個數,所以根據排列,1個位元組能代表256種不同的信息,即28(0和1兩種可能,8位排列),比如定義一個位元組大小的無符號整數(unsigned char),那麼它能表示的是0~255(0~28-1)這些數,一共是256個數,因為,前面說了,一個位元組只能表示256種不同的信息。別停下,還是一個位元組的無符號整數,我們來進一步剖析它,0是這些數中最小的一個,我們先假設它在計算機內部就用8位二進製表示為00000000(從理論上來說也可以表示成其他不同的二進制碼,只要這256個數每個數對應的二進制碼都不相同就可以了),再假設1表示為00000001,2表示為00000010,3 表示為00000011,依次類推,那麼最大的那個數255在8位二進制中就表示為最大的數11111111,然後,我們把這些二進制碼換算成十進制看看,會發現剛好和我們假設的數是相同的,而事實上,在計算機中,無符號的整數就是按這個原理來儲存的,所以告訴你一個無符號的整數的二進制碼,你就可以知道這個數是多少,而且知道在計算機中,這個數本身就是以這個二進制碼來儲存的。比如我給你一個2個位元組大小的二進制碼,首先聲明它表示的是無符號的整數: 00000000 00000010,我們把前面的0省略,換算一下,它表示的也是數值2,和前面不同的是,它佔了2個位元組的內存。不同的類型占的內存空間不同,如在我的電腦中char是1個位元組,int是4個位元組,long是8個位元組(你的可能不同,這取決於不同的計算機設置),它們的不同之處僅僅是內存大的能表示的不同的信息多些,也就是能表示的數范圍更大些(unsigned int能表示的范圍是0~28*4-1),至於怎麼算,其實都是一樣的,直接把二進制與十進制相互轉換,二進制就是它在計算機中的樣子,十進制就是我們所表示的數。啊哈,原來這些都是可以計算的呀,我曾經還以為不同的計算機儲存的原理是不同的,取決於商家的喜好呢,呵呵。說了這么多怎麼還沒有提到原碼、反碼和補碼呀,別急別急,心急吃不了熱豆腐,呵呵,因為無符號的整數根本就沒有原碼、反碼和補碼。(啊,那不是被欺騙了,5555````我告訴媽媽去,哥哥欺負我)都說了別急嘛,你就不想想我說了這么半天的無符號整數,那麼有符號的整數怎麼辦啊?
呵呵,對,只有有符號的整數才有原碼、反碼和補碼的!其他的類型一概沒有。雖然我們也可以用二進制中最小的數去對應最小的負數,最大的也相對應,但是那樣不科學,下面來說說科學的方法。還是說一個位元組的整數,不過這次是有符號的啦,1個位元組它不管怎麼樣還是只能表示256個數,因為有符號所以我們就把它表示成范圍:-128-127。它在計算機中是怎麼儲存的呢?可以這樣理解,用最高位表示符號位,如果是0表示正數,如果是1表示負數,剩下的7位用來儲存數的絕對值的話,能表示27個數的絕對值,再考慮正負兩種情況,27*2還是256個數。首先定義0在計算機中儲存為00000000,對於正數我們依然可以像無符號數那樣換算,從00000001到01111111依次表示1到127。那麼這些數對應的二進制碼就是這些數的原碼。到這里很多人就會想,那負數是不是從10000001到11111111依次表示-1到-127,那你發現沒有,如果這樣的話那麼一共就只有255個數了,因為10000000 的情況沒有考慮在內。實際上,10000000在計算機中表示最小的負整數,就是這里的-128,而且實際上並不是從10000001到11111111 依次表示-1到-127,而是剛好相反的,從10000001到11111111依次表示-127到-1。負整數在計算機中是以補碼形式儲存的,補碼是怎麼樣表示的呢,這里還要引入另一個概念——反碼,所謂反碼就是把負數的原碼(負數的原碼和和它的絕對值所對應的原碼相同,簡單的說就是絕對值相同的數原碼相同)各個位按位取反,是1就換成0,是0就換成1,如-1的原碼是00000001,和1的原碼相同,那麼-1的反碼就是11111110,而補碼就是在反碼的基礎上加1,即-1的補碼是11111110+1=11111111,因此我們可以算出-1在計算機中是按11111111儲存的。總結一下,計算機儲存有符號的整數時,是用該整數的補碼進行儲存的,0的原碼、補碼都是0,正數的原碼、補碼可以特殊理解為相同,負數的補碼是它的反碼加1。下面再多舉幾個例子,來幫助大家理解!
十進制 → 二進制 (怎麼算?要是不知道看計算機基礎的書去)
47 → 101111
有符號的整數 原碼 反碼 補碼
47 00101111 11010000 00101111(正數補碼和原碼相同)
-47 00101111 11010000 11010001(負數補碼是在反碼上加1)
再舉個例子,學C語言的同學應該做過這道題:
把-1以無符號的類型輸出,得什麼結果?(程序如下)
#include<iostream.h>
void main()
{
short int n=-1;
cout<<(unsigned short int)n<<endl;
}
首先在我的電腦中short int類型的儲存空間是2個位元組,你的可能不同,我說過,這取決於你的計算機配置。它能儲存28*2=65536個不同的數據信息,如果是無符號那麼它的范圍是0~65535(0~216-1),如果是有符號,那麼它的范圍是-32768~32767(-215~215-1)。這道題目中,開始n是一個有符號的短整型變數,我們給它賦值為-1,根據我們前面所說的,它在計算機中是以補碼11111111 11111111儲存的,注意前面說了是2個位元組。如果把它強制為無符號的短整型輸出的話,那麼我們就把剛才的二進制把看成無符號的整型在計算機中儲存的形式,對待無符號的整型就沒有什麼原碼、反碼和補碼的概念了,直接把11111111 11111111轉化成十進制就是65535,其實我們一看都是一就知道它是范圍中最大的一個數了。呵呵,就這么簡單。你個把上面的源代碼編譯運行看看,如果你的電腦short int也是兩個位元組,那就會和我得一樣的結果。你可以先用這個語句看看:cout<<sizeof(short int)<<endl;看看你的電腦里的短整型佔多少的儲存空間,也可以用sizeof來看其它任何類型所分配的儲存空間。
最後提醒一句,關於數據如何在計算機中儲存的,這里只適用於整型的數據,對於浮點型的是另一種方式,這里我們暫時就不深究了