【WIP】C 语言拾遗 Part.1

long 与 long long

long 一般占用4~8字节,long long 至少 占用8个字节。不同的平台和编译器,长度可能不同。

sizeof() 运算符

注意 sizeof() 属于运算符的一种,这个运算符用于测量括号内的变量(或类型)占用的字节数量。多数情况下,这一数量在编译时确定,因此 sizeof() 的运行结果是一个编译时常量。但也有例外,如C99标准引入的变长数组特性。该类数组的size需在程序运行时、数组开辟后确定。

由于是编译时常量,括号内如果是表达式,则表达式不会被执行。

1
2
3
int a = 1; // a = 1
int b = sizeof(a++); // b = 4
// a = 1, a++ 没有执行

浮点数精度问题

老生长谈的话题了。由于误差,以下的逻辑判断结果都是成立(1):

1
2
(0.1 + 0.1 + 0.1) != 0.3; // 1;
1 + (1e123 - 1e123) != (1 + 1e123) - 1e123; // 1;

没有 body 的 for 循环

可以写成如下形式:

1
2
3
for(i = 0; i < 10; i++) {
;
}

或者如下形式:

1
for(i = 0; i < 10; i++);
阅读更多

【WIP】CMU 15-213 笔记 Part.1

Lecture 1

实验

Lab1:数据实验,用位运算方式实现计算器

Lab2:炸弹实验,学会GDB

Lab3:攻击实验,代码注入和ROP

Lab4:缓存实验,写个缓存模拟器并优化

Lab5:Shell实验,写一个完整的Linux Shell

Lab6:Malloc实验,写自己的Malloc库

Lab7:代理实验,写自己的Web Proxy

Lecture 2

比特、字节和整数

  • long double数据类型:在传统的32位架构或64位架构中是没有的。但在x86-64架构中占10或16字节(内存对齐)。

  • 32位架构的指针为32位(4字节),64位架构的指针为64位(8字节)。

  • 布尔代数:和 或 非 异或

  • 位运算符 & | ~ ^,逻辑运算符 && || !

  • 逻辑运算的短路特性

  • 逻辑位移和算数位移:

    • 在位移运算符之前的数(比如$x<<y$中的$x$)是无符号数的话,位移运算对应的汇编指令为逻辑位移。若是有符号数,该运算对应的汇编指令是算数位移。
    • 对于左移:二者都是在右侧补0。
    • 对于右移:逻辑位移补0,算数位移补最高有效位(符号位)。如:令$x=10100000_{(2)}$,右移3位,逻辑位移结果$x>>3=00010100_{(2)}$,算数位移结果$x>>3=11110100_{(2)}$。
  • 位移数小于0(即$x<<y$中的$y$小于0)或大于数据类型占用的长度(如char类型中y大于8)是未定义的操作。结果和编译情况依编译器和架构变化。

  • 正数原码转十进制:求2的幂次加和即可。

$$ B2U(X) = \sum^{w-1}_{i=0}{x_i \cdot 2^i} $$

  • 补码转十进制:注意符号位。也可写成公式。

$$ B2T(X) = -x_{w-1} \cdot 2^{w-1} + \sum^{w-2}_{i=0}{x_i \cdot 2^i} $$

  • 补码计算举例:将补码$101101_{(2)}$化为十进制。

$$ 依据公式,\\ 101101_{2} = 2^{0} \cdot 1 + 2^{1} \cdot 0 + 2^{2} \cdot 1 + 2^{3} \cdot 1 + 2^{4} \cdot 0 + 2^{5} \cdot (-1) \\ = 1 + 0 + 4 + 8 + 0 - 32 = -19 $$

  • 无符号数最大值$2^w - 1$,最小值$0$。有符号数最大值$2^{w-1} - 1$,最小值$-2^{w-1}$。
阅读更多
PHP 及 PHP 插件编译

PHP 及 PHP 插件编译

图源:《明日方舟》 战场背景2

今后文章会同步更新在我的 CSDN 博客,但是还是以这个自己拿阿里云服务器搭建的网站为主的。不过CSDN有个好处是可以被国内的搜索引擎抓取到,嗯,省得我做搜索引擎优化了啊。

如果有人只想看完整写完的文章的话,也请左拐 CSDN,或者这里。主站开了七牛云加速,顺便做了 Google 、 Bing 和百度等的搜索引擎收录。最近身体欠佳。原定的学习计划和博客更新计划也不出意外的咕了。没有办法。健康是第一要务。等待过后慢慢去补吧。

编译 PHP

安装必要环境

包含编译器,和编译需要的库。所有的编译操作均在 Ubuntu 19.04 下进行。

1
2
sudo apt-get update
sudo apt install -y gcc g++ cmake make libxml2-dev libbz2-dev libcurl4-gnutls-dev libzip-dev libwebp-dev libpng-dev libjpeg-dev libxpm-dev libfreetype6-dev

下载源码

你可以 clone GitHub 上的代码:

1
git clone https://github.com/php/php-src.git

当然也可以到 php.net 下载源码并解压:

1
2
3
4
wget https://www.php.net/distributions/php-7.3.7.tar.gz
tar -xvzf php-7.3.7.tar.gz
rm php-7.3.7.tar.gz
cd php-7.3.7/

开始编译

首先读取插件列表(插件列表没有修改的时候可跳过此步骤):

1
./buildconf --force
阅读更多
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×