信息的處理與表示

計(jì)算機(jī)以8位為一塊(稱作字節(jié)byte)作為最小的可尋址的內(nèi)存單位。
虛擬地址空間(virtual address space)


小端表示與大端表示是關(guān)于某一個(gè)數(shù)據(jù)在計(jì)算機(jī)的存儲(chǔ)順序

以字節(jié)為單位


布爾代數(shù)中,and可用于令特定位為0,or可用于令特定位為1,xor可用于令特定位保持不變叁鉴。

A xor B = (A&~B) | (~A&B)
其本質(zhì)含義是,將不同的拿出來(lái)。


在C語(yǔ)言中,編譯器大多認(rèn)為對(duì)符號(hào)數(shù)右移為算數(shù)右移岗照。


無(wú)符號(hào)的編碼和補(bǔ)碼的編碼,定義由向量從右到左排列之和笆环。

具有唯一性

宏能保證:無(wú)論代碼如何被編譯的谴返,都能生成正確格式
如printf("x=%" PRId32 ", y=%" PRIu64 "\n",x,y)
C預(yù)處理器遇到僅用空格分割的字符串常量序列,就串聯(lián)起來(lái)


反碼最高位權(quán)重比補(bǔ)碼低1
原碼最高位表符號(hào)

兩者都有兩個(gè)0,一般不采用


補(bǔ)碼用2^w - x咧织,表示-x嗓袱,而反碼由直接表示

有符號(hào)數(shù)與無(wú)符號(hào)數(shù)之間的轉(zhuǎn)換
我們采用二進(jìn)制作為過(guò)渡

補(bǔ)碼->無(wú)符號(hào)數(shù)
x + 2^w if< 0
x if> 0
也就是x+X(w-1)2^w*
無(wú)符號(hào)數(shù)->補(bǔ)碼(Two's Complement)
u <= TMax(w)
u-2^w > TMax(w)
在C語(yǔ)言中,向無(wú)符號(hào)靠近习绢。
-1 < 0U 時(shí) 為0
2147483647U > -2147483647 - 1 為0

在上述中采用了-2147483647-1渠抹。
在宏定義中,主要是因?yàn)槠婀值囊?guī)則闪萄。采用了這種方式梧却。

#define INT_MAX 2147483647
#define INT_MIN  (-INT_MAX - 1)

零擴(kuò)展與符號(hào)擴(kuò)展

在C語(yǔ)言中,short->unsigned時(shí)败去,先改變大小放航,再完成無(wú)符號(hào)轉(zhuǎn)換


無(wú)符號(hào)的截?cái)鄶?shù)字是取模
有符號(hào)的截?cái)鄶?shù)字是取模后再轉(zhuǎn)為有符號(hào)


由于這種強(qiáng)制類型轉(zhuǎn)換會(huì)導(dǎo)致錯(cuò)誤

getpeername的安全漏洞。
函數(shù)void *memcpy(void *dest, void *src, size_t n);復(fù)制到用戶的緩沖區(qū)圆裕。
n如果選用負(fù)數(shù)-->變成size_t的無(wú)符號(hào)數(shù)广鳍,可能導(dǎo)致溢出

Java中沒(méi)有無(wú)符號(hào)數(shù)


無(wú)符號(hào)加法的溢出
x+y x+y < 2^w
x+y-2^w 2^ <= x+y <2^(w+1)
求反則是2^w-x

檢測(cè)(x+y)>= x


補(bǔ)碼加法的溢出
正溢出:x+y - 2^w(本質(zhì):去掉溢出的,再加上符號(hào)的負(fù))
正常:x+y
負(fù)溢出:x+y + 2^w(只進(jìn)了1位吓妆,變成正的赊时,+上進(jìn)的,+符號(hào))

對(duì)于負(fù)溢出
我們先將其轉(zhuǎn)換為無(wú)符號(hào)數(shù)行拢,則+2^w祖秒,去掉高處部分,此時(shí)符號(hào)位為0舟奠。
我們要記住的就是:正-->負(fù), 負(fù)-->正, 正常-->正常
推導(dǎo)方式竭缝,轉(zhuǎn)為無(wú)符號(hào),再轉(zhuǎn)回來(lái)沼瘫。
最終表達(dá)式x+y = U2Tw[(x+y)mod 2^w]
:補(bǔ)碼取的是-x的表示方法

檢測(cè):s==(x+y)當(dāng)x>0,y>0抬纸,s<=0,與x<0,y<0, s>=0

阿爾貝群中加法逆元操作恒成立


補(bǔ)碼的非晕鹊,除了最小值=自己松却,其他相反

一、非的位級(jí)表示溅话,~x+1 與 -x相同晓锻。二、從右到左飞几,第一個(gè)1砚哆,以前取反。


無(wú)符號(hào)乘法=截?cái)?/em>
補(bǔ)碼乘法=U2Tw(xymod2^w)*

位級(jí)等價(jià)性


乘法是否溢出

int tmult_ok(int x, int y){
  int p = x*y;
  return !x || p/x == y;
}

證明方法:
一屑墨、xy = p + t2^w躁锁。僅有t>0時(shí),溢出
二卵史、除法時(shí)战转,p=xy+r,xy = xy + r + t2^w以躯,
三槐秧、僅當(dāng)r = t2^w時(shí),原式成立忧设。此時(shí)刁标,t=0,不溢出
在這里我們闡明三個(gè)問(wèn)題址晕。
首先膀懈,x
y=p在t>0時(shí),不滿足谨垃。
q=y當(dāng)且僅當(dāng)t=r=0時(shí)成立启搂。
否則q就不等于y,那么也就表明溢出刘陶。

補(bǔ)碼乘法狐血,本來(lái)就是截?cái)嗟模敲匆簿鸵馕吨缀耍绻朔òl(fā)生溢出匈织,那么截?cái)嘁簿统霈F(xiàn)了問(wèn)題。
我們要注意的就是牡直,溢出的值使得仍保留在原位的值不再與實(shí)際值相同

int tmult_ok(int x, int y){
  int64_t pll = (int64_t)x*y;
  return pll == (int)pll;
}

這里可以再次說(shuō)明缀匕,乘法的位級(jí)等價(jià)性,不僅僅用于說(shuō)明乘積的位級(jí)表示相同碰逸,還說(shuō)明乡小,無(wú)符號(hào)乘積在溢出的判斷的意義是和補(bǔ)碼是等價(jià)的。

void *copy_elements(void *ele_src[]), int ele_cnt, size_t ele_size){
  void *result = malloc(ele_cnt * ele_size);
  if(result == NULL)
    return NULL;
  void *next = result;
  int i;
  for(i=0; i<ele_cnt; i++){
    memcpy(next, ele_src[i], ele_size);
    next += ele_size;
  }
  return result;
}

假如在malloc 處發(fā)生溢出饵史,則分配內(nèi)存不足满钟,導(dǎo)致緩沖區(qū)溢出胜榔。


乘以常數(shù),利用移位優(yōu)化湃番。
考慮k的形式 n位到m位都是1

形式A:(x<<n) + (x<<(n-1)) + ...+(x<<m)
形式B:(x<<(n+1)) - (x<<m)

當(dāng)n = m時(shí)夭织,A
當(dāng)n = m+1,A B同速
當(dāng)n > m+1吠撮,B


除以2的冪

無(wú)符號(hào)尊惰,直接>>
補(bǔ)碼,加偏置(y-1)
原因:負(fù)數(shù)要向0舍入泥兰,
x = qy+r, floor((x+y-1)/y) = q+(floor(r+y-1)/y)

C表達(dá)式:(x<0 ? x+(1<<k)-1 : x) >> k


寫一個(gè)函數(shù)div16弄屡,對(duì)于整數(shù)參數(shù)x返回x/16的值。你的函數(shù)使用除法鞋诗、模運(yùn)算膀捷、乘法、任何條件語(yǔ)句(if或者削彬?:)担孔、任何比較運(yùn)算符(>、<吃警、==)或任何循環(huán)糕篇。你可以假設(shè)數(shù)據(jù)類型int是32位字長(zhǎng),使用補(bǔ)碼表示酌心,而右移是算術(shù)右移拌消。

int div16(int x){
  ins bias = (x>>31) & 0xF;
  return (x+bias)>>4;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市安券,隨后出現(xiàn)的幾起案子墩崩,更是在濱河造成了極大的恐慌,老刑警劉巖侯勉,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹦筹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡址貌,警方通過(guò)查閱死者的電腦和手機(jī)铐拐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)练对,“玉大人遍蟋,你說(shuō)我怎么就攤上這事∶荆” “怎么了虚青?”我有些...
    開(kāi)封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)螺男。 經(jīng)常有香客問(wèn)我棒厘,道長(zhǎng)纵穿,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任奢人,我火速辦了婚禮谓媒,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘达传。我一直安慰自己,他們只是感情好迫筑,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布宪赶。 她就那樣靜靜地躺著,像睡著了一般脯燃。 火紅的嫁衣襯著肌膚如雪搂妻。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天辕棚,我揣著相機(jī)與錄音欲主,去河邊找鬼。 笑死逝嚎,一個(gè)胖子當(dāng)著我的面吹牛扁瓢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播补君,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼引几,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了挽铁?” 一聲冷哼從身側(cè)響起伟桅,我...
    開(kāi)封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎叽掘,沒(méi)想到半個(gè)月后楣铁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡更扁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年盖腕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浓镜。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赊堪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出竖哩,到底是詐尸還是另有隱情哭廉,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布相叁,位于F島的核電站遵绰,受9級(jí)特大地震影響辽幌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜椿访,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一乌企、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧成玫,春花似錦加酵、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至钦勘,卻和暖如春陋葡,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背彻采。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工腐缤, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肛响。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓岭粤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親特笋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绍在,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容