【CS:APP】第二章 家庭作業(yè)

版權(quán)聲明:本文為 gfson 原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處。
注:作者水平有限,文中如有不恰當(dāng)之處,請(qǐng)予以指正,萬(wàn)分感謝。

2.55 - 2.57

2.55 - 2.57.png
  • 答案:
#include <stdio.h>

typedef unsigned char *byte_pointer;

void show_bytes(byte_pointer start, size_t len){
    size_t i;
    for(i=0;i<len;i++)
        printf(" %.2x",start[i]);
    printf("\n");
}

void show_short(short x){
    show_bytes((byte_pointer) &x, sizeof(short));
}

void show_int(int x){
    show_bytes((byte_pointer) &x, sizeof(int));
}

void show_long(long x){
    show_bytes((byte_pointer) &x, sizeof(long));
}

void show_float(float x){
    show_bytes((byte_pointer) &x, sizeof(float));
}

void show_double(double x){
    show_bytes((byte_pointer) &x, sizeof(double));
}

int main(void){
    
    short s = 34;
    int i = 34;
    long l = 34L;
    float f = 34.0f;
    double d = 34.0;
    
    show_short(s);
    show_int(i);
    show_long(l);
    show_float(f);
    show_double(d);
    
    return 1;
}


上述代碼運(yùn)行后,結(jié)果如下:

result.png

對(duì)運(yùn)行結(jié)果進(jìn)行分析:

  1. 可以直觀(guān)的看到當(dāng)前計(jì)算機(jī)上各個(gè)類(lèi)型所占的字節(jié)。其中,short 占 2 個(gè)字節(jié), int、long、float 占 4 個(gè)字節(jié),double 占 8 個(gè)字節(jié)。
  2. 可以看出當(dāng)前機(jī)器字節(jié)順序使用的是小端法。
  3. short、int、long 計(jì)算:2 * 16 + 2 = 34。
  4. float 計(jì)算:
  • 0x420800 = [0100 0010 0000 1000 0000 0000]2
  • 由于遵循 IEEE 標(biāo)準(zhǔn),float 中 s 字段為 1,k = 8,n = 23,所以:
    • Bias = 2k-1 - 1 = 127,
      e = [1000 0100] 2 = 132,
      E = e - Bias = 5,
      f = [0.000 1000 0000 0000 0000 0000]2 = 1/16,
      M = 1 + f = 1 + 1/16,
      s = 0,
      V = (-1)s * 2E * M = 32 * (1 + 1/16) = 34。
  1. double 計(jì)算:
  • 0x4041000000000000 = [0100 0000 0100 0001 0000 0000 ... 0000]2
  • 由于遵循 IEEE 標(biāo)準(zhǔn),double中 s 字段為 1,k = 11,n = 52,所以:
    • Bias = 2k-1 - 1 = 210 - 1,
      e = [100 0000 0100] 2 = 210 + 4,
      E = e - Bias = 5,
      f = [0.000 1000 0000 0000 0000 0000 ... 0000]2 = 1/16,
      M = 1 + f = 1 + 1/16,
      s = 0,
      V = (-1)s * 2E * M = 32 * (1 + 1/16) = 34。

2.58

2.58.png
  • 答案:
int is_little_endian(){
    int a = 1;
    return *((char*)&a);
}

int main(void){ 
    int result = is_little_endian();
    printf("result is: %d \n",result);
    return 1;
}

2.59

2.59.png
  • 答案:
int mix(int x, int y){
    return (x & 0xFF) | (y & (~0xFF));
}

int main(void){ 
    int result = mix(0x89AECDEA,0x76743210);
    printf("result is: %x \n",result);
    return 1;
}

2.60

2.60.png
  • 答案(兩種方法):
unsigned replace_byte_1(unsigned x, int i, unsigned char y){
    char* start = (char*)&x;
    start[i] = y;
    return x;
}

unsigned replace_byte_2(unsigned x, int i, unsigned char y){
    return (x & ~(0xFF<<(i<<3)) | (y << (i<<3)));
}

int main(void){ 
    unsigned result_1 = replace_byte_1(0x12345678, 2, 0xAB);
    printf("result_1 is: %x \n",result_1);
    unsigned result_2 = replace_byte_2(0x12345678, 3, 0xAB);
    printf("result_2 is: %x \n",result_2);
    return 1;
}

對(duì) replace_byte_2 的解釋?zhuān)?/p>

  • 以參數(shù)(0x12345678, 2, 0xAB)為例,從 0x12345678 -> 0x12AB5678 需要經(jīng)歷如下過(guò)程:
    1. 0xAB -> 0x00AB0000,0xAB << 2 * 2 *4,0xAB << 2 << 3,y << (i << 3)
    2. 0x12345678 -> 0x12005678,0x12345678 & 0xFF00FFFFFF,0x12345678 & ~0x00FF000000,0x12345678 & ~(0xFF << 2 * 2 * 4),0x12345678 & ~(0xFF << 2 << 3),(x & ~ (0xFF << (i<<3))
    3. 0x12AB5678 = 0x00AB0000 | 0x12005678 = (x & ~(0xFF << (i<<3)) | (y << (i<<3)))

位級(jí)整數(shù)編碼規(guī)則

位級(jí)整數(shù)編碼規(guī)則-1.png
位級(jí)整數(shù)編碼規(guī)則-2.png

接下來(lái)的作業(yè)需要遵循位級(jí)整數(shù)編碼規(guī)則

2.61

2.61.png
  • 答案:
    • A: !(~x)
    • B: !x
    • C: !((~x) & 0xFF)
    • D: !(x & (~0xFF)) 或者 !(x>>((sizeof(int)-1)<<3))

經(jīng)驗(yàn)

  1. 核心判斷是零與非零,目的是需要達(dá)到在一種情況下結(jié)果所有位為 0,其他情況下有些位不為 0。
  2. 在 D 中,可以通過(guò) x & (~0xFF) 的方法使得除最高位字節(jié)以外的字節(jié)都為 0,也可以通過(guò) (x>>((sizeof(int)-1)<<3)) 的方法將最高位右移至最低位,來(lái)判斷結(jié)果所有位是否為 0。

2.62

2.62.png
  • 答案(兩種方法):
int int_shifts_are_arithmetic_1(){
    return !(((0xFF<<((sizeof(int)-1)<<3))>>((sizeof(int)-1)<<3)) + 0x01 );
}

int int_shifts_are_arithmetic_2(){
    int x = -1;
    return (x>>1) == -1;
}

int main(void){ 
    int result_1 = int_shifts_are_arithmetic_1();
    printf("result_1 is: %d \n",result_1);
    int result_2 = int_shifts_are_arithmetic_2();
    printf("result_2 is: %d \n",result_2);
    return 1;
}

經(jīng)驗(yàn)

  1. 第一種方法,0xFF 先左移到最高字節(jié),然后右移到最低字節(jié),判斷其所有位是否為 1。
  2. 第二種方法,非常巧妙,通過(guò) -1 既 0xFFFFFFFF 右移一位判斷其值是否改變。

2.63

2.63.png
  • 答案:
unsigned srl(unsigned x, int k){
    unsigned xsra = (int) x >> k;
    int w = sizeof(int)*8;
    unsigned z = 2 << (w-k-1);
    return (z - 1) & xsra;
}

int sra(int x, int k){
    int xsrl = (unsigned) x >> k;
    int w = sizeof(int) << 3;
    unsigned z = 1 << (w-k-1);
    unsigned mask = z - 1;
    unsigned right = mask & xsrl;
    unsigned left = ~mask & (~(z&xsrl) + z);
    return left | right;
}

int main(void){ 
    unsigned result_srl = srl(-1,1);
    printf("result_srl is: %x \n",result_srl);
    int result_sra = sra(-1,1);
    printf("result_sra is: %x \n",result_sra);
    return 1;
}

運(yùn)行結(jié)果如下:

Result.png

解析

  1. 對(duì)于 srl,目的就是將前面的高位清 0,即 xsra & (1<<(w-k) - 1)。額外注意 k==0 時(shí),不能使用 1<<(w-k),于是改用 2<<(w-k-1)。
  • 注意,最大移位數(shù)不能夠 > w-1,因?yàn)橐莆粩?shù)達(dá)到 w 之后的行為是未定義的,沒(méi)有標(biāo)準(zhǔn)。
  • 對(duì)于形如 0x00001111 的情況,均可以使用 0x00010000 -1 的方式獲得。
  1. 對(duì)于 sra,目的是將 xrsl 的第 w-k-1 位擴(kuò)展到前面的高位。這個(gè)可以利用取反加 1 來(lái)實(shí)現(xiàn),不過(guò)這里的加 1
    是加 1<<(w-k-1)。如果 x 的第 w-k-1 位為 0,取反加 1 后,前面位全為 0,如果為 1,取反加 1 后就全是 1。最后再使用相應(yīng)的掩碼得到結(jié)果。
  • 本題將第 w-k-1 位擴(kuò)展到前面高位的思想非常巧妙,需要根據(jù)代碼答案仔細(xì)體會(huì)。

2.64

2.64.png
  • 答案:
int any_odd_one(unsigned x){
    return !!(x & 0x55555555);
}

int main(void){ 
    int result = any_odd_one(0xaaaaaaaa);
    printf("result is: %d \n", result);
    return 1;
}

解析

  • 此題思路是將偶數(shù)位全部取 0,奇數(shù)位不變。
  • 需要注意的一點(diǎn)時(shí),最后結(jié)果是 bool 類(lèi)型,如果直接 x & 0x55555555 得出的不是 bool 類(lèi)型,所以需要使用 ! 進(jìn)行轉(zhuǎn)換,既 !!(x & 0x55555555)

2.65

2.65.png
  • 答案:
int odd_ones(unsigned x){
    x = x ^ (x >> 1);  
    x = x ^ (x >> 2);  
    x = x ^ (x >> 4);  
    x = x ^ (x >> 8);  
    x = x ^ (x >> 16);  
    return x & 1;  
} 

int main(void){ 
    int result = odd_ones(9);
    printf("result is: %d \n", result);
    return 1;
}

解析

  • 由 1^1 = 0,1^0 = 1,0^0 = 0,可知,偶數(shù)個(gè) 1 異或的結(jié)果是 0,奇數(shù)個(gè) 1 異或的結(jié)果是 1
  • 比如,求 10101110 中的 1 的個(gè)數(shù)是奇數(shù)還是偶數(shù),由 1^0^1^0^1^1^1^0 = 1 可知,個(gè)數(shù)為奇數(shù)。
  • 所以我們得出結(jié)論,x 的每個(gè)位異或,最后的結(jié)果為 0,則有偶數(shù)個(gè) 1,為 1,則有奇數(shù)個(gè) 1
  • 回到本題,我們的目的是為了將 x 中的所有位的值進(jìn)行異或運(yùn)算,使用分治的思想
  • x ^ (x >> 1) 表示 x 中的每一位和其后一位進(jìn)行異或,假設(shè)得到的結(jié)果為 x1,則 x1 中的第 1 位的值表示 x 中第 1、2 位的異或結(jié)果,x1 中的第 3 位的值表示 x 中第 3、4 位的異或結(jié)果。
  • 這個(gè)時(shí)候,x ^ (x >> 2) 既 x1 ^ (x1 >> 2),表示 x1 中的每一位和其后第二位進(jìn)行異或,假設(shè)得到的結(jié)果為 x2,則** x2 中的第 1 位的值表示 x1 中第 1、3 位的異或結(jié)果,既表示 x 中第 1、2、3、4 位的異或結(jié)果**,x2 中的第 5 位的值表示 x1 中第 5、7 位的異或結(jié)果,既表示 x 中第 5、6、7、8 位的異或結(jié)果。
  • 根據(jù)以上可以推出,x ^ (x >> 4) 的結(jié)果 x3 的第一位表示 x2 的 1、5 位的異或結(jié)果,表示 x 的 1、2、3、4、5、6、7、8 位的異或結(jié)果
  • 同理,x ^ (x >> 8) 的結(jié)果 x4 的第一位表示 x 的 1 到 16 位的異或結(jié)果x ^ (x >> 16) 的結(jié)果 x5 的第一位表示 x 的 1 到 32 位的異或結(jié)果
  • 所以,最后只有通過(guò) x5 & 1 來(lái)判斷 x5 的第一位是 0 還是 1 即可。

2.66

2.66.png
  • 答案:
int leftmost_one(unsigned x){
    x |= (x >> 1);
    x |= (x >> 2);
    x |= (x >> 4);
    x |= (x >> 8);
    x |= (x >> 16);
    return x^(x>>1);
}

int main(void){ 
    int result = leftmost_one(0x9f);
    printf("result is: %x \n", result);
    return 1;
}

解析

  • 根據(jù)提示,我們可以想到 00001111 ^ 00000111 = 00001000,所以接下來(lái)需要將 x 轉(zhuǎn)化為 [00…011…1] 的形式。
  • 我們可以想到,用最高位的 1 分別與其他位進(jìn)行或運(yùn)算。
  • 假設(shè) x 就是 10000000... 該如何讓每一位都為 1。方法如下:
    • 先是 x 右移1位再和原 x 進(jìn)行或,變成 1100000...,再讓結(jié)果右移 2 位和原結(jié)果或,變成 11110000...,最后到 16 位,變成 11111111...。

2.67

2.67.png
  • 答案:
    A:1<<32 在 32 位機(jī)器上是未定義的。
    B:將 1<<32 修改為 2<<31
    C:代碼如下:
int bad_int_size_is_32(){
    int a = 1<<15; 
    a<<=15; 
    int set_msb = a<<1; 
    int beyond_msb = a<<2;
    return set_msb && !beyond_msb;
}
int main(void){ 
    int result = bad_int_size_is_32();
    printf("result is: %d \n", result);
    return 1;
}

解析

  • C 中需要將 31 拆分為 15+15+1

2.68

2.68.png
  • 答案:
int lower_one_mask(int n){
    return (2 << (n-1)) - 1;
}

int main(void){ 
    int result = lower_one_mask(32);
    printf("result is: %x \n", result);
    return 1;
}

2.69

2.69.png
  • 答案:
unsigned rotate_left(unsigned x, int n){
    return (x << n)|(x >> 1 >> ((sizeof(int)*8)- n -1));
}

int main(void){ 
    unsigned result = rotate_left(0x12345678, 32);
    printf("result is: %x \n", result);
    return 1;
}

2.70

2.70.png
  • 答案:
int fits_bits(int x, int n){
    x >>= (n-1);
    return !x || !(~x);
}

int main(void){ 
    int result = fits_bits(8, 4);
    printf("result is: %d \n", result);
    return 1;
}

解析

  • 這一題是看 x 的值是否在 - 2^(n-1) 到 2^(n-1) - 1 之間。
  • 如果 x 滿(mǎn)足這個(gè)條件,則其第 n-1 位就是符號(hào)位。如果該位為 0,則前面的 w-n 位均為 0,如果該位為 1,則前面的 w-n 位均為1。所以本質(zhì)是判斷,x 的高 w-n+1 位是否為 0 或者為 -1。

2.71

2.71.png
  • 答案:
    A:得到的結(jié)果是 unsigned,而并非擴(kuò)展為 signed 的結(jié)果。
    B:正確代碼如下:
int xbyte(packed_t word, int bytenum){
    int ret = word << ((3 - bytenum)<<3);
    return ret >> 24;
}

解析

  • B 中使用 int,將待抽取字節(jié)左移到最高字節(jié),再右移到最低字節(jié)即可。

2.72

2.72.png
  • 答案
    A:size_t 是無(wú)符號(hào)整數(shù),因此左邊都會(huì)先轉(zhuǎn)換為無(wú)符號(hào)整數(shù),它肯定是大于等于 0 的。
    B:判斷條件改為 if(maxbytes > 0 && maxbytes >= sizeof(val))

解析

  • B 中為什么要先判斷 maxbytes > 0,是因?yàn)槿绻?maxbytes < 0,在執(zhí)行 maxbytes >= sizeof(val)) 時(shí),會(huì)先將 maxbytes 轉(zhuǎn)化為無(wú)符號(hào)數(shù),這樣就會(huì)導(dǎo)致結(jié)果與預(yù)期的不符合。

2.73

2.73.png
  • 答案
#include <limits.h>

int saturating_add(int x, int y){
    int w = sizeof(int)<<3;
    int t = x + y;
    int ans = x + y;
    x>>=(w-1);
    y>>=(w-1);
    t>>=(w-1);
    int pos_ovf = ~x&~y&t;
    int neg_ovf = x&y&~t;
    int novf = ~(pos_ovf|neg_ovf);
    return (pos_ovf & INT_MAX) | (novf & ans) | (neg_ovf & INT_MIN);
} 

int main(void){ 
    int result = saturating_add(INT_MIN, -1);
    printf("result is: %x \n", result);
    return 1;
}

解析

  • 對(duì)于有符號(hào)整數(shù)相加,溢出的規(guī)則可以總結(jié)為:
    • t = a+b。
    • 如果 a,b 異號(hào),則肯定不會(huì)溢出。
    • 如果 a,b 中有一個(gè)為 0,則肯定不會(huì)溢出。
    • 如果 a>0 && b>0,則只有當(dāng) t<0 時(shí)才算正溢出。
    • 如果 a<0 && b<0,則只有當(dāng) t>0 時(shí)才算負(fù)溢出。
    • 所以:
      • a > 0,b > 0,t < 0,正溢出。
      • a < 0,b < 0,t > 0,負(fù)溢出。

思路

  • 碰到一個(gè)復(fù)雜問(wèn)題時(shí),如果一下子無(wú)法看出規(guī)律,應(yīng)該要善于總結(jié)條件和推理結(jié)果,從這個(gè)過(guò)程中尋找規(guī)律

2.74

2.74.png
  • 答案
#include <stdint.h>

int tsub_ok(int x, int y){
    int w = sizeof(int)<<3;
    int t = x - y;
    x>>=(w-1);
    y>>=(w-1);
    t>>=(w-1);
    return !((x != y) && (y == t));
}

int main(void){ 
    int result = tsub_ok(INT32_MIN, 1);
    printf("result is: %d \n", result);
    return 1;
}

解析

  • 對(duì)于有符號(hào)整數(shù)相減,溢出的規(guī)則可以總結(jié)為:
    • t = a-b。
    • 如果 a,b 同號(hào),則肯定不會(huì)溢出。
    • 如果 a,b 中有一個(gè)為 0,則肯定不會(huì)溢出。
    • 如果 a>0 && b<0,則只有當(dāng) t<0 時(shí)才算溢出。
    • 如果 a<0 && b>0,則只有當(dāng) t>0 時(shí)才算溢出。
    • 所以,a,b 異號(hào),t,b 同號(hào)即可判定為溢出

2.75

2.75.png
  • 答案
unsigned unsigned_high_prod(unsigned x, unsigned y){
    int w = sizeof(int)<<3;
    return signed_high_prod(x, y) + ((int)x>>(w-1)) & y + ((int)y>>(w-1)) & x;
}

解析

  • 假如 x'、y' 分別表示 2 的補(bǔ)碼表示的有符號(hào)數(shù) x、y 對(duì)應(yīng)的無(wú)符號(hào)數(shù),xw-1、yw-1 分別表示有符號(hào)數(shù) x、y 的最高位符號(hào)位,則在數(shù)據(jù)類(lèi)型 unsigned 是 w 位的機(jī)器上,有如下結(jié)論:
    • x' = x + xw-1 * 2w
    • y' = y + yw-1 * 2w
    • x'y' = xy + x * yw-1 * 2w + y * xw-1 * 2w + xw-1 * yw-1 * 22w
  • 我們知道,在 w 位機(jī)器上,無(wú)論是有符號(hào)數(shù),還是無(wú)符號(hào)數(shù),乘法的本質(zhì)是將結(jié)果 2w 位截?cái)酁榈?w 位,然后再用相應(yīng)的有符號(hào)數(shù)或無(wú)符號(hào)數(shù)表示。所以,乘法結(jié)果的高 w 位表示需要在乘法結(jié)果的基礎(chǔ)上右移 w 位,即除以 2w,假設(shè) x'y'_h、xy_h 分別為其乘積的高位表示,則有如下結(jié)論:
    • x'y'_h = xy_h + x * yw-1 + y * xw-1 + xw-1 * yw-1 * 2w
    • 由于 x'y'_h 只有 w 位,所以 xw-1 * yw-1 * 2w 最后會(huì)被截?cái)嗟簦瑢?duì)結(jié)果沒(méi)有影響,則有如下結(jié)論:
      • x'y'_h = xy_h + x * yw-1 + y * xw-1
  • 由于本題要求遵循位級(jí)編碼規(guī)則,即不能使用乘號(hào),所以可以進(jìn)行如下變換,巧妙的使用 int 進(jìn)行移位,并進(jìn)行與運(yùn)算:
    • x * yw-1 = x * (y>>(w-1)) = ((int)y >> (w-1)) & x
    • y * xw-1 = y * (x>>(w-1)) = ((int)x >> (w-1)) & y
  • 所以最后結(jié)果為:
    • x'y'_h = xy_h + ((int)y >> (w-1)) & x + ((int)x >> (w-1)) & y

2.76

2.76.png
  • 答案
    //TODO

2.77

2.77.png
  • 答案
    A. (x << 4) + x
    B. x - (x << 3)
    C. (x << 6) - (x << 2)
    D. (x << 4) - (x << 7)

2.78

2.78.png
  • 答案
int divide_power2(int x, int k){
    int ans = x>>k;
    int w = sizeof(int)<<3;
    ans += (x>>(w-1)) && (x&((1<<k)-1));
    return ans;
} 

解析

  • 首先計(jì)算 x>>k
  • 然后考慮除法的向零舍入,即 x<0 且 x 的最后 k 位不為零時(shí)要加一。
    • 必須保證除法是向零舍入的。
    • 當(dāng) x>0 時(shí),x>>k 的結(jié)果是向下舍入的,由于 x 是正數(shù),所以是向零舍入,符合要求。
    • 當(dāng) x<0 且 x 的最后 k 位不為零時(shí),x>>k 的結(jié)果是向下舍入的,由于 x 是負(fù)數(shù),此時(shí)向下舍入后的值不符合向零舍入的目的,需要將結(jié)果加一才符合向零舍入。

2.79

2.79.png
  • 答案

// TODO

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,460評(píng)論 6 538
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,067評(píng)論 3 423
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 177,467評(píng)論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,468評(píng)論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,184評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,582評(píng)論 1 325
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,616評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,794評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,343評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,096評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,291評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,863評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,513評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,941評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,190評(píng)論 1 291
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,026評(píng)論 3 396
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,253評(píng)論 2 375

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