小知识

————————————————————————————

——————————     非代码部分    ———————————

————————————————————————————

 

1. 对于有些用Secure CRT,在windows下面粘贴过来的代码,可以用Visual(在Vim下面按'v'),然后选中需要修改的代码,按"=",就可以使其对齐了。

 

2. Vim由7.1升级成7.2,  导致Vim中backspace键失效,所以解决的办法就是在vimrc文件中加入如下代码:
          set backspace=indent,eol,start

          如果还不行的话,可能还需要
          set nocompatible

 

3. 389,424s/0x/(../)/0x/1/,/gc 一个vi中给类似0x00后加一个','的vi命令。通过这个命令,对正则表达式有了些了解

          389,424是行数,s是命令(swap),0x是字符串开头,/(../)是匹配任意两个字符,/1代表搜索字符串中的某段括住的表达式,gc是替换并询问。期间试过389,424s/0x/(../)/0x/(../)/,/gc这样写,发现字符串都被替换为0x(..)这样的,所以要用/1来得到之前表达式的结果,还试过389,424s/0x/(*/)/0x/1/,/gc这样写,因为'*'是没有字符限制的匹配,所以这种替换都是在行尾加','。

 

4. 在使用vim的命令工具时,有时会提示错误,例如E486: Pattern not found: 0x/(*/) ,这是可以使用:messages或者:echo errmsg来查看错误编号,并可以使用:help E486来查看错误信息。

 

5. 文本文件数据导入Excel分列问题,复制到excel后用分列,菜单栏,数据,分列,分隔符号,下一步,勾上“逗号”前的钩,完成。

 

6. 字符串类似10-1-2,输入单元格后会自动更改回日期模式2010-1-2,有两种方法:第一是在将10-1-2改为‘10-1-2, 在输入字符串前加入单引号’,第二种方法是关闭excel的自动修正功能。

 

7. samba与windows共享,而后用source insight打开。但问题在于:每次在 source insight里面做修改,而后切换到另一个文件的时后都会出现  “...  has been changed outside of the editor. Do you want to reload the file?" 必须将sourceinsight升级到3.50.0051或以上版本即可。

 

8. 删除IPC连接:

 

    命令一: net use 查看网络连接情况

 

 

    状态       本地        远程                      网络

    -------------------------------------------------------------------------------

    OK                     //172.17.51.81/xxx    Microsoft Windows Network

 

 

    命令二: net use //172.17.51.81/xxx /del  删除IPC连接

 

 

—————————————————————————

————————        代码部分    ——————————

—————————————————————————

1.Debug调试宏
 

 

2.调用函数宏
 

 

3.变量定义
 

 

4.变更数组元素个数后,可用sizeof()除法得到具体个数
 

 

5.取得形如AVSW-video-mute中个别单词

 

 

6.代码规范化:

 

 

7.文件操作


8.一个int型数据由几个宏'|'(或)成,例如
 

 

9.引用外部变量数组,必须制定大小

例如: apl_services[2][MAX_SERVICES];

否则就提示错误:invalid use of array with unspecified bounds

 

10.使用system()函数执行系统命令,参数为系统命令字符串

 

11.大小写字符转换函数
 

 

12.有用的微操作
 

 

13. 按任意键退出
 

 

14. 计算出结构体里成员的相对地址偏移量
 

15. Make 3.81版本中,对.o文件有隐含规则编译,导致如果使用*.o表示的所有.o文件都会去寻找相应的.c文件编译,,可用.d文件代替

 

16. IIC读取/写入数据,长度限制为4 byte(总线长度32 bit -> 4 byte),

 

17. 字符串操作时,对临时字符串变量一定要初始化(memset 0)。

 

18. long int strtol(const char *nptr, char **endptr, int base)
strtol()会将nptr指向的字符串,根据参数base,按权转化为long int, 然后返回这个值。
参数base的范围为2~36,和0;它决定了字符串以被转换为整数的权值。
可以被转换的合法字符依据base而定,举例来说,当base为2时,合法字符为‘0’,‘1’;base为8时,合法字符为 ‘0’,‘1’,……‘7’;base为10时,合法字符为‘0’,‘1’,……‘9’;base 为16时,合法字符为‘0’,‘1’,……‘9’,‘a’,……‘f’;base为24时,合法字符为‘0’,……‘9’,‘a’,……‘n’,base 为36时,合法字符为‘0’,……‘9’,‘a’,……‘z’;等等。其中,不区分大小写,比如,‘A’和‘a’会都会被转化为10。
当字符合法时,‘0’,……‘9’依次被转换为十进制的0~9,‘a’,……‘z’一次北转换为十进制的10~35。
strtol()函数检测到第一个非法字符时,立即停止检测,其后的所有字符都会被当作非法字符处理。合法字符串会被转换为long int, 作为函数的返回值。非法字符串,即从第一个非法字符的地址,被赋给*endptr。**endptr是个双重指针,即指针的指针。strtol()函数就是通过它改变*endptr的值,即把第一个非法字符的地址传给endptr。

多数情况下,endptr设置为NULL, 即不返回非法字符串。

 

19.解释例如mov ax,100H 这样一条指令的cpu, os, memory等都完成了什么样的工指令执行步骤:
(1)fetch            (取指令)
(2)decode           (解码)
(3)execute          (执行)
(4)memery           (读写内存)
(5)write back       (回写寄存器)
(6)PC update&       (更新program counter)

细说如下:
mov ax, 100h

被编译器转化成低级机器指令序列为: 66 b8 00 01   (32 位操作系统下)

1)fetch 取指
       opcode = *pc;
    从 PC 当前指向的内存处取第1个字节。然后,判断这 byte 是指令的 opcode 码,还是 prefix encode
在这个例子中,第1 byts 是 66,也就是说:这是一个prefix。 那么下一个 byte 就是 opcode 的 encode
读取 第 2 个 byte,判断这个 opcode 是什么操作,这是一个 mov instruction 操作码。
    那么,接下来的两个 bytes 就是 立即数。将它装入 ax 中;
    newPC = newPC + 4;   这是新的 PC 值。

2)decode 解码
    解析 66 这个字节,确定是 16 位 operand size
    解析 b8 这个字节,确定是 mov ax,imm 操作,
    解析 00 01, 确定是 immediate

3)excute 执行
    在 CPU ALU部件执行 temp = 100h 操作

4)memory 写内存
   这里已经免了

5)write back 写寄存器
    ax = temp;   写 ax 寄存器

6)update PC 更新PC (pc counter)
    PC = newPC
    newPC = nextPC

 

20.下面的程序会输出什么?

参考答案:该项程序输出如下所示, 0 12 1095237632 原因是:浮点数是4个字节,12.5f 转成二进制是:01000001010010000000000000000000,十六进制是:0x41480000,十进制是:1095237632。所以,第二和第三个输出相信大家也知道是为什么了。而对于第一个,为什么会输出0,我们需要了解一下float和double 的内存布局,如下:

float: 1位符号位(s)、8位指数(e),23位尾数(m,共32位)
double: 1位符号位(s)、11位指数(e),52位尾数(m,共64位)
然后,我们还需要了解一下printf由于类型不匹配,所以,会把float直接转成double,注意,12.5的float和double的内存二进制完全不一样。别忘了在x86芯片下使用是的反字节序,高位字节和低位字位要反过来。所以:

float版:0x41480000 (在内存中是:00 00 48 41)
double版:0x4029000000000000 (在内存中是:00 00 00 00 00 00 29 40)
而我们的%d要求是一个4字节的int,对于double的内存布局,我们可以看到前四个字节是00,所以输出自然是0了。 这个示例向我们说明printf并不是类型安全的,这就是为什么C++要引如cout的原因了。

 

21. printf 返回值是所需打印字符的个数

 

22. 短路求值:对于(条件1 && 条件2),如果“条件1”是false,那“条件2”的表达式会被忽略了。对于(条件1 || 条件2),如果“条件1”为true,而“条件2”的表达式则被忽略了。

 

23. 下面的C程序是合法的吗?如果是,那么输出是什么?

参考答案:本例是合法的,输出如下:

Hello! how is this? super That is C !
本例主要展示了一种另类的用法。下面的两种用法是相同的:

"hello"[2] 2["hello"]
如果你知道:a[i] 其实就是 *(a+i)也就是 *(i+a),所以如果写成 i[a] 应该也不难理解了。

 

24. #define PrintInt(expr) printf("%s : %d/n",#expr,(expr)) 名字和值的输出表达式

 

25. 位操作,优先级要比加法要低

 

26. sizeof操作符返回的是一个unsigned int类型

 

27. continue的含义是不执行循环体之后语义,而直接到循环点

 

28. 外部变量enviorn提供的访问环境变量的方式与main()函数中的argv提供的访问命令行参数的方式是一样的。区别在于你必须自己声明environ变量。虽然环境变量由POSIX标准化了,但是任何标准化过的头文件都没有专门声明environ,这似乎是从过去的习惯延续过来的。

 

29. Shell快捷键:

Ctrl-A 相当于HOME键,用于将光标定位到本行最前面

Ctrl-E 相当于End键,即将光标移动到本行末尾

Ctrl-B 相当于左箭头键,用于将光标向左移动一格

Ctrl-F 相当于右箭头键,用于将光标向右移动一格

Ctrl-D 相当于Del键,即删除光标所在处的字符

Ctrl-K 用于删除从光标处开始到结尾处的所有字符

Ctrl-L 清屏,相当于clear命令

Ctrl-R 进入历史命令查找状态,然后你输入几个关键字符,就可以找到你使用过的命令

Ctrl-U 用于删除从光标开始到行首的所有字符。一般在密码或命令输入错误时常用

Ctrl-H 删除光标左侧的一个字符

Ctrl-W 用于删除当前光标左侧的一个单词

Ctrl-P 相当于上箭头键,即显示上一个命令

Ctrl-N 相当于下箭头键,即显示下一个命令

Ctrl-T 用于颠倒光标所在处字符和前一个字符的位置。(目前不知道有什么作用,哪位朋友知道?)

Ctrl-J 相当于回车键

Alt-. 用于提取历史命令中的最后一个单词。你先执行history命令,然后再敲击此快捷键若干下,你就懂了!

Alt-BackSpace 用于删除本行所有的内容,基本上和Ctrl-U类似。

Alt-C 用于将当前光标处的字符变成大写,同时本光标所在单词的后续字符都变成小写。

Alt-L 用于将光标所在单词及所在单词的后续字符都变成小写。

Alt-U 用于将光标所在单词的光标所在处及之后的所有字符变成大写。

ps:使用bind -P命令可以查看所有键盘绑定。

ps2:Alt快捷键较少使用,因为常常和编辑器冲突

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值