1. 程式人生 > >一道容易出錯的題目(有關負數的補碼)

一道容易出錯的題目(有關負數的補碼)

這道題的答案是什麼?

#include <stdio.h>
#include <string.h>
int main()
{
	char a[1000];
	int i = 0;
	for(i = 0; i<1000; i++)
	{
		a[i] = -1-i;
	}
	printf("%d\n",strlen(a));
	return 0;
}


答案是255,這個255是怎麼來的呢?
在for迴圈內部,,當i  = 0,a[0] = -1 ,問題就在於,-1在記憶體裡是以補碼的形式儲存。
-1在記憶體中:
原碼:1000 0001
反碼:1111 1110
補碼:1111 1111
(0xff)
同理:-2的補碼是1111 1110(0xfe) 
當i的值到127時,a[127] = -128,-128是char型別能表示的最小負數。
-128的原碼是: 1  1000 0000
            反碼是:1  0111 1111
            補碼是:1 1000  0000
所以用低八位1000 0000表示-128,。
當i增加到128時,a[i] = -129,所以這是發生了溢位,高位被捨棄,剩下的8位是原來9位的補碼的低八位。
-129: 1 1000 0001 原碼  
            1 0111 1110 反碼
            1 0111 1111 補碼       
取低八位: 0111 1111,也就是0x7f
接下來,a[129] = 130,也是同樣的方法,取原來九位的補碼的低八位:0111 1110 
……
當i為255時,a[i] = -256,補碼的低八位是 0000 0000
當i為256時,a[i] = -257,補碼的低八位是 1111 1111,開始新一輪迴圈。
我們知道,strlen函式是遇到‘\0’停止,而a[255] = 0。

總結:
1.char型別預設情況下是有符號的,
2.char型別表示的值的範圍是[-128,127],超出此範圍則溢位,
3.在計算機系統中,數值一律用補碼儲存。


相關推薦

一道容易出錯題目有關負數補碼

這道題的答案是什麼? #include <stdio.h> #include <string.h> int main() { char a[1000]; int i =

一道閉包題目常看看

function f1(){ var n=999; nAdd = function(){ n += 1 } function f2(){ console.log(n); } return f2; } var result1=f1(); var result2=f1(); res

面試常見題目:大數相加的Java實現考慮負數情況

前言: 在做面試題目時,我們經常看到有這樣的題目:將兩個很大的數相加,超過100位。 網上可以看到很多答案,但是這些答案大部分都是沒有考慮負數的情況。 首先我們已經不能直接用long型別進行表示了

【省選水題集Day1】一起來AK水題吧! 題目更新到A

不同的 運算 得到 只有一個 參加 .html color spa 大於 題解:http://www.cnblogs.com/ljc20020730/p/6937954.html 水題A: [AHOI2001]質數和分解 題目網址: https://www.luogu.o

《歡聚時代2017校招筆試題目PHP工程師類---錯題解析》

dpx cti tex jsm tgw mdi ref wota php 8某06痘翁4用wm潘脖柿http://www.zcool.com.cn/collection/ZMTgwMDY4MzY=.html y1兇萄Dp速06蕉j侖誥竅http://www.zcool.c

越困難越容易激發動力Git與github

總結 dos 很多 分布式版本控制 name tar 開放 http rbo   看到這次的作業讓我有點頭暈,全是英文,黑屏界面,有點難以上手。但是跟著步驟一步一步的走,還是可以漸漸地學到很多東西。雖然難但是學會的感覺還是很不錯的。   是Git是一款免費、開源的分布式版本

紅綠燈面試題目Promise, 佇列實現

紅燈三秒亮一次,黃燈1秒亮一次,綠燈2秒亮一次,,如何讓三個燈不斷交替重複亮燈 light函式返回一個Promise狀態,當Promise狀態從Pending => fulfilled,step才會執行下一個then。這裡使用遞迴,不使用迴圈是因為Ja

2018.11.07 hdu1465不容易系列之一二項式反演

傳送門 其實標籤只是搞笑的。 沒那麼難。 二項式反演只是殺雞用牛刀而已。 這道題也只是讓你n≤20n\le20n≤20的錯排數而已。 還記得那個O(n)O(n)O(n)的遞推式嗎? 沒錯那個方法比我今天

3、關於匿名內部類一個小題目補全程式碼

/* 匿名內部類面試題: 按照要求,補齊程式碼 interface Inter { void show(); } class Outer { //補齊程式碼 } class OuterDemo { public static void mai

HDU - 1465 - 不容易系列之一遞推,

大家常常感慨,要做好一件事情真的不容易,確實,失敗比成功容易多了! 做好“一件”事情尚且不易,若想永遠成功而總從不失敗,那更是難上加難了,就像花錢總是比掙錢容易的道理一樣。 話雖這樣說,我還是要告訴大家,要想失敗到一定程度也是不容易的。比如,我高中的時候,就有一個神奇的女生,在英語考試的時候

校招季——程式設計題目15、16 約瑟夫問題 最大子矩陣和

15. 約瑟夫問題(題目042) 題目: n個人圍成一圈,從第一個開始報數,第m個將被殺掉,最後剩下一個,其餘人都將被殺掉。求最後剩下的人的序號。例如n=6,m=5,被殺掉的人的序號為5,4,6,2,3。最後剩下1號。 解答: 思路: 如果要列印整個過程,有3種方法: 1.

關於easyui的layout的region的resize的題目自適應瀏覽器

1. resize題目: ¥(""#subWrap"").layout(""panel"", ""east"").panel(""resize"",{width:300}); ¥(""#subWrap"").layout(""resize""); 經由過程上方兩句程式碼來實現layout的east的寬度

其他CTF題目記錄備忘

/message.php?id=1 AND ORD(MID((SELECT IFNULL(CAST(`value` AS CHAR),0x20) FROM isg.flags ORDER BY `value` LIMIT 0,1),34,1))>1

手機網頁製作的認識有關meta標籤

<meta name="apple-mobile-web-app-capable" content="yes">  <meta name="apple-mobile-web-app-status-bar-style" content="black" />  <meta http-

歡聚時代2017校招筆試題目web前端類B卷

1.以下程式中i的輸出值為: var i = 10; for(var i = 0; i < 5; i++){ i += 2; } console.log(i); 答案:6 在js中只有全域性作用域和函式作用域,沒有塊級作用域。全域性i會被for

切換不同的資料狀態佈局,包含載入中、空資料和出錯狀態利用開源框架

implementation 'com.github.Bakumon:StatusLayoutManager:1.0.4' 將要

廣州傳智播客iOS基礎班C語言考試題目自我感覺挺簡單的,很多老師講的都沒考到,錯了一道選擇題,加油,OC!

廣州傳智播客iOS基礎班C語言考試題目 考試時間:180分鐘 滿分:100分 及格分數:80分 一、選擇題(共10題,每題5分)  1. 若有陣列 int arr[2][3];  則對a陣列元素的正確訪問是(C )     A. arr(1,2)       B. ar

一道值得思考的資料結構題目入棧與出棧序列

就業指導課上做的一道資料結構中有關棧的題目,當時一開始自己思考不全面,錯選了。 一個棧的入棧序列為1,2,3,…,n ,其出棧序列是 p 1 ,p 2 ,p 3 ,…p n 。若p 2 = 3,則 p 3 可能取值的個數是() A:n -3 B:n - 2

一道promise的小題目Promise非同步流程控制

用Promise控制非同步流程,三個非同步任務,時間可能有先後,但是要按照想要的順序輸出。 我這裡用四種方法解決,其實也就是考察你對Promise的理解,基礎題了。 //實現mergePromise函式,把傳進去的陣列順序先後執行, //並且把返回的資料先後放到陣列data中 const timeout =

負數轉換為二進位制的表達原碼,反碼,補碼

我們已經知道計算機中,所有資料最終都是使用二進位制數表達。 我們也已經學會如何將一個10進位制數如何轉換為二進位制數。 不過,我們仍然沒有學習一個負數如何用二進位制表達。 比如,假設有一 int 型別的數,值為5,那麼,我們知道它在計算機中表示為: 00000000