《CSAPP》读书杂记 - Chapter 2. Representing and Manipulating Information

1.

代码:

#include <stdio.h>

typedef unsigned char *byte_pointer;

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

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

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

void show_pointer(void * x)
{
  show_bytes((byte_pointer)&x, sizeof(void *));
}

void test_show_bytes(int val)
{
  int ival = val;
  float fval = (float)ival;
  int *pval = &ival;
  printf(" %x\n", pval);
  show_int(ival);
  show_float(fval);
  show_pointer(pval);
}

int main()
{
  test_show_bytes(12345);
}

运行结果:

 56683c18
 39 30 00 00
 00 e4 40 46
 18 3c 68 56 ff 7f 00 00

其中函数show_int()、show_float()的调用比较好理解。

show_int()中&x取到实际地址。为使获取地址指向数据中每个字节的内容,需要进行类型转换,即把int *转换成unsigned char *,但是类型转换后已经不知道数据的长度,所以需要人工传入数据长度的参数,即 sizeof(int)。此后,把每次指针指向的内容(unsigned char形式)以十六进制形式输出。show_float()类似。

int *pval = &val 运行后,pval为指针,64位,其内容指向val的地址。printf(" %x\n", pval)是以十六进制形式输出地址,但是由于 %x只能表示32位,所以去掉高32位,变成 56 68 3c 18,小端模式输出后即为 18 3C 68 56

时间: 2024-10-13 00:18:22

《CSAPP》读书杂记 - Chapter 2. Representing and Manipulating Information的相关文章

《CS:APP》 chapter 2 Representing and Manipulating Information 笔记

Representing and Manipulating Information 首先,普及一下历史知识,原来十进制数都使用1000多年了...其实我真不知道...斐波拉契(Fibonacci)很屌的说(废话....) The familiar decimal, or base-10, representation has been in use for over 1000 years, having been developed in India, improved by Arab math

Chap 2 Representing and Manipulating Information (CS:APP)

-------------------------------------------------------------------------------------------------- Author: YuManZI 2014/06/23  1.1-3.5 2014/06/24  3.6-3.8 2014/06/27  4.1 2014/06/28  4.2-4.5 -----------------------------------------------------------

《Thinking in C++》读书笔记——Chapter 3: The C in C++ (2)

Chapter3: The C in C++ (2) Bitwise operators (1)The bitwise exclusive or, or xor (^) produces a one in the output bit if one or the other input bit is a one, but not both. (2)Bitwise operators can be combined with the = sign to unite the operation an

CSAPP 读书笔记 - 2.31练习题

根据等式(2-14) 假如w = 4 数值范围在-8 ~ 7之间 2^w = 16 x = 5, y = 4的情况下面 x + y = 9 >=2 ^(w-1)  属于第一种情况 sum = x + y = 9- 2^w  = –7 sum – x == y? -7 – 4 = – 11 属于第三种情况 负溢出 sum – x  = –7 - 4= –11 + 2^w = 5  = y? 明显是等于的 同样 sum- y = x ? -7 – 5 = –12 + 2^w = 4 = x? 所以溢

CSAPP读书随笔之一:为什么汇编器会将call指令中的引用的初始值设置为-4

CSAPP,即<深入理解计算机系统:程序员视角>第三版,是一本好书,但读起来确需要具备相当的基本功.而且,有的表述(中译文)还不太直白. 比如,第463页提到,(对于32位系统)为什么汇编器会将call指令中的引用的初始值设置为-4.其后解释语焉不详.结合文中对代码计算公式的展开: *refptr = (unsigned) (ADDR(r.symbol) + *refptr - refaddr) = (unsigned) (0x80483c8        + (-4)     - 0x804

【csapp读书笔记3】x86 Assembly Language

这部分其实没什么好笔记的...毕竟和课本上的x86汇编是一样的 不过有需要pay attention的地方就是x86汇编有两种书写形式:Intel format和AT&T format (csapp  Page200) Intel format:就是常见于Microsoft和Intel的文档中.另外中国的教材也用这种format AT&T format:csapp就用的这种.另外gcc.objdump等工具反编译的代码默认也是这种格式 主要区别就是操作数中source和destinatio

【csapp读书笔记二】关于整数和浮点数的日常

PART I: Integer There are two types of integer : unsigned integer(only positive) & signed integer(positive,negative and 0)So how does a computer storage an integer? 1.Regarding unsigned integer: CPU use binary to represent unsigned integer directly.e

MySQL Crash Course #13# Chapter 21. Creating and Manipulating Tables

之前 manipulate 表里的数据,现在则是 manipulate 表本身. INDEX 创建多列构成的主键 自动增长的规定 查看上一次插入的自增 id 尽量用默认值替代 NULL 外键不可以跨引擎 添加字段与删除字段 & 定义外键 复杂表结构的修改 删除表与修改表名 非常工整的 . .模范脚本: CREATE TABLE customers ( cust_id int NOT NULL AUTO_INCREMENT, cust_name char(50) NOT NULL , cust_a

《程序员的数学思维修炼》 读书笔记 Chapter 1 数据的表示

1.未赋值的变量--初始化的必要性. 无初始化时,视语言的不同可能有以下几种情况 1)赋值0 2)赋值空 3)不改变该内存块原值,即随此刻值. 4)编译失败 2.除数为0的判断防ERROR 3.大整数的解决方法 1)在Pascal中超过数据类型上限是会报错的.C等则可能出奇葩数据.实质上更增加了挑错难度.(C类该特性待验证) 2)此时就需要我们所称的 高精度 计算--模拟算法. 通过String(AnsiString)或数组表示一个大整数 根据人类计算思维编写计算逻辑 加减乘代码(http://