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. HDU 3081Marriage Match II(二分法+并检查集合+网络流量的最大流量)

    职务地址:http://acm.hdu.edu.cn/showproblem.php? pid=3081 有一段时间没写最大流的题了,这题建图竟然想了好长时间... 刚開始是按着终于的最大流即是做多轮 ...

  2. XP用户:消除误解,大胆拥抱Linux

         4月23日.知名家评论家Silviu Stahie发表文章.题为"Windows Users and Their Misconceptions About Linux". ...

  3. jQuery关于mouseover和mouseenter的区别

    原生的mouseenter是dom3级的事件,对于jQuery等一些框架已经实现了这个事件.但是它到底跟mouseover有什么区别? jQuery在实现这两个事件的时候,mouseover支持事件冒 ...

  4. 我的第一个html计算器

    html代码. <!DOCTYPE HTML> <html> <head> <style type="text/css"> body ...

  5. Oracle存储过程的一点使用总结

    [博客文章背景]博客开通已经1.2年了,一直碍于技术能力,不敢献丑.想起1年前在一个数据处理相关项目结束后,代金排主管让我做一个数据库开发总结文档和一个Toad.PL/SQL Developer工具的 ...

  6. 学习Oracle一个星期以来的总结

    公司开发部门主要分2部分:.net开发和Oracle PL\SQL开发.刚入职的我被分到Oracle PL\SQL组了.Oracle是比SQL Server更大的数据库应用,我在学校只接触过SQL S ...

  7. ajax 实现异步请求

    ajax实现异步请求: function onclicks() { $.ajax( { url:'../hhh/columnSearch.do',// 跳转到 action // data: {tab ...

  8. 学习java的视频资源(尚学堂)(比较老旧,但是还是挺好用)

    本人新手,转入IT,一开始在学校的时候看过尚学堂 马士兵讲过的java基础视频教程,这次深入学习呢,就从百度云盘找了一整套的视频资源.之后越深入的学习呢,发现这些视频资源VeryCD上都发布了,地址 ...

  9. 这是第二道题内容要求写一个银行的ATM系统 这个浪费了好长时间 ,遇到了许多问题,不过都解决了,上程序

    下面的4个用户是我宿舍的,当然我是钱最多的,呵呵! #include<iostream>#include<string>using namespace std; class c ...

  10. 27 Remove Element

    Given an array and a value, remove all instances of that value in place and return the new length. T ...