1. 一段查看地址内容的代码

代码:

#include <stdio.h>

typedef unsigned char *byte_pointer;

void show_bytes(byte_pointer start, int len)
{
int i;
for(i = ; 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();
}

运行结果:

 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形式)以十六进制形式输出;若指针是以char形式表示,则转换为十六进制时会认为有符号,所以会出现补全ffffff的情况。show_float()类似。

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

对于show_pointer函数,传递的是 int*指针,实参强制转换为void*指针,而&x转换为指向void*指针的指针,即void**指针,要访问void*指针的内容,需要void*指针的地址,即void**指针和void*指针的长度。之后情况与上面类似。

2. 问题2.27

写一个判断无符号加法是否溢出的函数

int uadd_ok(unsigned x, unsigned y)
{
unsigned sum = x + y;
return sum >= x;
}

若无溢出,则 sum >= x 恒成立

若溢出,则 sum = x + y - 2^w,由于 y < 2^w,则 sum < x

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

  1. chapter 2: Representing and manipulating information

    C allows conversion between unsigned and signed. The rule is that the underlying bit representation ...

  2. Chap 2 Representing and Manipulating Information (CS:APP)

    -------------------------------------------------------------------------------------------------- A ...

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

    CSAPP,即<深入理解计算机系统:程序员视角>第三版,是一本好书,但读起来确需要具备相当的基本功.而且,有的表述(中译文)还不太直白. 比如,第463页提到,(对于32位系统)为什么汇编 ...

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

    之前 manipulate 表里的数据,现在则是 manipulate 表本身. INDEX 创建多列构成的主键 自动增长的规定 查看上一次插入的自增 id 尽量用默认值替代 NULL 外键不可以跨引 ...

  5. csapp读书笔记-并发编程

    这是基础,理解不能有偏差 如果线程/进程的逻辑控制流在时间上重叠,那么就是并发的.我们可以将并发看成是一种os内核用来运行多个应用程序的实例,但是并发不仅在内核,在应用程序中的角色也很重要. 在应用级 ...

  6. 【Reading Note】算法读书杂记

    1 排序 排序基本信息 稳定性:排序前大的数在排序后,大的数依然保持不变就是稳定排序,反之不稳定 内外排序:根据待排序的记录是否放在内存里面区分的.诸如:插入排序(直接插入&希尔).交换排序( ...

  7. 【Reading Note】Python读书杂记

    赋值 >>> list=[] >>> app=[list,list,list] >>> app [[], [], []] >>> ...

  8. 《OS X Mountain Lion》 读书杂记

    OS X是一个类UNIX操作系统,由底层的Darwin和上层的OS X应用程序框架(Cocoa, Carbon, Quartz等)及Aqua用户界面组成.其中Darwin是一个开源.完整的POSIX- ...

  9. CSAPP 读书笔记 - 2.31练习题

    根据等式(2-14) 假如w = 4 数值范围在-8 ~ 7之间 2^w = 16 x = 5, y = 4的情况下面 x + y = 9 >=2 ^(w-1)  属于第一种情况 sum = x ...

随机推荐

  1. UML视图(四)状态图

    以下是一个图书馆管理系统的状态图,非常典型,涵盖状态图的全部元素的使用,由于状态图相对照较简单,直接从看图就能非常好地掌握.假设想对状态图的元素严谨的概念进行了解,在图下方,有仔细的叙述. 看了上面的 ...

  2. CentOS6.5与XP双系统安装

    因为工作的须要,须要安装一个XP系统和一个CentOS系统.依照在网上找到的一些方法尝试了下,结果都不是非常理想.最后,经过尝试和寻找,找到了一个比較方便的方法. 一.分区 本人的电脑硬盘是500G, ...

  3. leetcode_question_125 Valid Palindrome

    Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignori ...

  4. Android长方形图片生成正圆形,以及矩形图片生成圆角

    一般要做正圆形图片,只能是正方形的基础上才能实现,否则就变成椭圆了,下面说说如何使长方形的图片生成正圆形图片 废话不多说,没图没真相,先上图吧: 原图:  变成正圆后:  下面上代码: public ...

  5. 【贪心】【TOJ4107】【A simple problem】

    Given three integers n(1≤n≤1018), m(1≤m≤105), k(1≤k≤1018). you should find a list of integer A1,A2,- ...

  6. css控制父元素下的子元素自适应高度,且高度一致

    css代码: .wrap{width:600px;margin:0 auto; overflow:hidden;} .left{background:#ccc;width:300px;float:le ...

  7. UVA 1569 Multiple

    题意: 给定m个1位数字,要求用这些数字组成n的倍数的最小数字,如果无法组成就输出0 分析: BFS,由于n最大5000,余数最多5000,利用余数去判重,并记录下路径即可 代码: #include ...

  8. LevelDB.NET性能测试

    最近了解了一下LevelDB,发觉这个嵌入式的K-V数据性能不错,所以顺便想在使用层面了解一下.由于LevelDB也有针对.net的实现,所以就针对了LevelDB.NET进行了一个简单的读写压力测试 ...

  9. poj 3411 Paid Roads

    题意:有m条路,n座城市,走这些路是要付费的,每条路由两种付费方案,设一条路两端是a,b,如果走完这条路在b点付费的话,应付r,如果走这条路之前在c点付费的话,应付p,求从1端点走到n端点的最小费用. ...

  10. js:关于IE6/7下new Date(值)输出为NaN的解决方案

    不得不再次说,万恶的IE,你太守旧了吧,这里出错的原因是IE的时间格式,不是2012-01-23(很多人喜欢用这样的格式) 而是2012/01/23(怎么感觉像是在用VB6和access啊) 搞了好久 ...