C语言学习笔记(一)
1.原码和补码
例子
'6':原码:0110; 补码:0110
'-6':原码:1110; 反码:1001;补码:1010 = 1001 + 1
(-6) + 6 = 0110 + 1010 = (1)0000 = 0;
当对补码取补时,得到的是他的原码;
2.编译过程:
预编译——>编译(汇编语言)——>汇编(机器语言)——>链接
3.'chmod -R': 针对目录,将目录下的子目录及文件的权限全部修改。
4. snprintf()和sprintf()的比较:snprintf()要求其第二个参数指定目标缓冲区的大小,可确保缓冲区不溢出。
5.32位UNIX系统的一般编程模型称为ILP32模型,表示整数(I),长整数(L),和指针(P)都占用32位
数据类型 ILP32模型 LP64模型
char 8 8
short 16 16
int 32 32
long 32 64
pointer 32 64
6.对整型常数进行类型转换的后缀有:u或U(unsigned)、l或L(long)、u/U与l/L的组合(如:ul、lu、 Lu等)。例:100u; -123u; 0x123l。
通过后缀L或l将整数强行存储在long类型中。
所有的实数都是以double存储。
7.常量在内存中的存储方式:
1(0x0001): 在内存中以unsigned short(两字节)存储;
'1'(0x31): 一个字节;
"1": 字符串常量必须以'\0'来结束,占两个字节。
8.scanf()输入结束的条件:
a.遇空格,TAB,或回车
b.
c.遇非法字符
scanf()有返回值,成功返回"1",不成功"0"。
9.
a: for(i = 0; i < n; i++)
a[i] = 4;
b: for(p = a; p < a + n; p++)
*p = 4;
(a)以a为首地址,向前移动i个元素,每次赋值都要这样做,"[]"是个运算符。
(b)每次都向后移一个单位就行了,(b)的效率明显要高。
10.%f和%lf
(a):
<stdio.h>
int main()
{
int a, b, c;
double y;
a = scanf("%lf",&y);
printf("%d,%f,%lf\n",a,y,y); }
输入1234567891234567890
输出1,1234567891234567936.000000,1234567891234567936.000000
gdb:
Breakpoint 1, main () at 12_11_4.c:7
7 a = scanf("%lf",&y);
(gdb) s
12345678912345678912
8 printf("%d,%f,%lf\n",a,y,y);
(gdb) p y
$2 = 1.234567891234568e+19
(b):
#include <stdio.h>
int main()
{
int a, b, c;
double y;
a = scanf("%f",&y);
printf("%d,%f,%lf\n",a,y,y);
}
输入123.11
输出1,0.000000,0.000000
第二次输出为什么都是零呢?
看gdb调试:
Breakpoint 1, main () at 12_11_4.c:7
7 a = scanf("%f",&y);
(gdb) s
1234.123
8 printf("%d,%f,%lf\n",a,y,y);
(gdb) p y
$1 = 4.8545332934724682e-270
1234.123是被读入成功的,但是存放格式是float。