1樓:匿名使用者
計算機中一個正數的負數是其補碼+1。這樣做的原因是可以保證1個正數跟其負數相加永遠為0
例如,+1是0x00000001 (0x是16進位制,假設1個int有四個位元組長度),其負數-1則表示為0xfffffff1。(可以很容易驗證兩者相加為0)。
把0xfffffff1表示為8進製表示則為37777777777。
你得到的值是177777是由於你(應該是他們)的系統int只有兩個位元組。但是道理是一樣。
2樓:點點點迴圈
程式中int變數賦值的都是10進位制的數
本題考驗的是10進位制轉8進位制,同時要注意的是記憶體大小,int佔16位首先10進位制轉為二進位制
8->0(0...)1000
這裡需要注意,計算機裡,表示負數不是直接使用原碼(絕對值的二進位制),而是要用補碼+1來表示
-1->0(0...)0001->1(1...)1110+1->1(1...)1111
二進位制轉8進位制(每隔3位二進位制變一個八進位制數,補齊16位為18位,前面加個00)
000(0...)1000->0(0.....)1 0001(1...)1111->1(7...)7
3樓:
你這個系統的int型是16位2位元組的。
j=-1,是個有符號整形,對應二進位制是11111111 11111111,共16個1。
%o以八進位制輸出,上面的16個1對應到八進位制,就是177777。
4樓:名字重複了
別告訴我溢位了。。。
c語言:-1以8進位制輸出為什麼是177777?
5樓:戶信婁酉
首先,你的機器是32位機,也就是1個字佔32個bit位,這樣一個字最多可表示的十進位制數字為
2^32
=4294967296。然後在該字中存放-1,這樣該字的值為4294967295
轉換為8進位制就是3777777777
6樓:手機使用者
從上面看你的編譯器裡的int是佔兩個位元組!!
-1的補碼是這麼算出來的:
(0000 0000 0000 0001)取反=1111 1111 1111 1110
1111 1111 1111 1110 + 1 = 1111 1111 1111 1111
而1111 1111 1111 1111化成8過制就是 177777
當int 以%d輸出的話 1111 1111 1111 1111 就是以有符號十進位制的形式顯示也就是:-1
當int 以%o輸出的話 1111 1111 1111 1111 就是無符號的八進位制形式顯示也就是:177777
7樓:匿名使用者
計算機中用的是補碼,負數的補碼是符號位不變,其他位取反,再加1
8樓:匿名使用者
高位應該有兩個零,只是沒輸出而已
為什麼-1八進位制輸出是177777,十六進位制輸出位為ffff?
9樓:匿名使用者
計算機用補碼錶bai示負數,補碼是對du二進位制數取反zhi+1得到,若用dao16位表示,即為版0000 0000 0000 0001,取反為1111 1111 1111 1110,+1為1111 1111 1111 1111,即為-1,換成權十六進位制即為0xffff,換成8進製為0177777.
這麼做的目的是把最高位當作符號位,0111 1111 1111 1111就是32767,1000 0000 0000 0000被人為解釋成-32768,而將32767取反+1就是1000 0000 0000 0001,即-32767,以此類推,1111 1111 1111 1111就是-1了,負數的最高位總是1,正數總是0,所以該位也被稱之為有符號數的符號位
c語言中,-1的輸出問題
10樓:世鑲柳
因為你的編譯器是16位的,所以……
如果是32位的,如vc 2008就不是這樣的結果了。
11樓:匿名使用者
-1的補碼錶示是1111111111111111,按十進位制輸入出是-1,按八進位制輸出是把這個數從尾向頭三位一組三位一組輸出。也就是1,111,111,111,111,111。你算一下當然是177777了。
按十六進位制輸出是4位一組來輸出。1111,1111,1111,1111把每個4位算出來就是ffff。
12樓:
八進位制,十六進位制輸出與編譯器有關.
負數用補碼錶示.
補碼等於反碼加1
十六進位制:
-1 -> 負 0001 -> 反碼 fffe + 1-> ffff
十六進位制 ffff ->
2進位制 1111 1111 1111 1111 ->每3位合成一位,轉 8 進位制:
1 111 111 111 111 111177777
---------------------ms vc++ 編譯器 得:
十六進位制 ffffffff
8進位制 37777777777
[原理相同,字長比你的編譯器長]
為什麼執行 int a=-1; printf("%d,%o",a,a);時輸出為-1,177777,謝謝
13樓:聽不清啊
這是因為int在計算機中是以補碼形式存放的。
在16位的c編譯器中,int佔2個位元組,-1的補碼是1111111111111111(16個1)
所以,以十進位制輸出時為-1,以八進位制輸出時就是177777
14樓:
預設是以整型資料輸出的,樓主的 int a=-1; printf("%d,%o",a,a);時輸出為-1,177777是正確的結果,因為在整型中,「-1」的八進位制數是177777,若果樓主把程式改為 int a=-1; printf("%d,%lo",a,a);時,那麼相應的輸出就會為-1,-1了,樓主可以試試
15樓:笑白打醬油
你這個應該是16位機吧
-1的2進位制碼是 1111 1111 1111 1111,然後對應一下如圖所示:
16樓:
前面一個輸出的是a=-1;後面一個格式不對,輸出得是隨機數
printf("%d,%o,%x",-1,-1,-1);
17樓:騎著瘋牛撞交警
在程式設計中,資料在記憶體中都是以補碼的形式儲存的。
-1用原碼錶示為:
1000000000000001
它的補碼為:
111111111111111;
而%d 表示以十進位制形式輸出資料 結果為-1;
%o表示以八進位制形式輸出資料 結果為177777;
%x表示以十六進位制形式輸出資料 結果為 ffff;
希望可以幫到你。
18樓:唯一客
整型的-1.八進位制的-1,十六進位制的-1(注:負數在2.8.16進位制裡,都是取反加一)
19樓:匿名使用者
這裡是對-1進行不同的表示。
%d的意思是輸出「以帶符號的十進位制形式輸出整數(負數時輸出符號,正數不輸出。)」
%o的意思是「以無符號的八進位制形式輸出整數。」
%x的意思是「以無符號的十六進位制形式輸出整數。」
位元組不同輸出的結果可能也會不同吧,
不過我感覺這題的目的就是去我上面寫的那些基本的意思吧。呵呵
20樓:
你定義的識別符號不同,輸出結果就不同,也就是輸出不同型別的-1;
21樓:匿名使用者
整數-1在計算機中用16進製表示就是0ffff。
%d將-1用整數顯示,所以看到-1
%o將-1用8進位制顯示,你自己轉換一下就能看到顯示的結果吧。
%x將-1用16進位制顯示,所以看到ffff。
為什麼 1八進位制輸出是177777,十六進位制輸出位為ffff
計算機用補碼錶bai示負數,補碼是對du二進位制數取反zhi 1得到,若用dao16位表示,即為版0000 0000 0000 0001,取反為1111 1111 1111 1110,1為1111 1111 1111 1111,即為 1,換成權十六進位制即為0xffff,換成8進製為0177777....
1 實現十進位制純小數向二進位制 八進位制 十六進位制純小數的轉換
以下是basic程式 a為十進位制小數,x為要轉換的進位制。供參考。10 a 0.875 11 x 16 12 i 0 20 print 0.21 a a x 22 b int a 23 a a b 24 print b 25 i i 1 26 if a 0 and i 10 goto 2130 e...
C語言的十進位制數轉換八進位制演算法有哪些
原發布者 血戰長空wlg 題目 數制轉換問題1.需求分析將十進位制數n轉換成八進位制數是計算機實現計算的基本問題,解決方案很多,其中最簡單的方法是除8取餘法。1 本方案採用順序棧的方式模擬整個過程。其原理如下 例子 1348 10 2504 8nndiv8nmod813481684168210212...