C语言培训第一天
下面是一些命令,先来谈谈今天的若干收获吧!
计算机中的一切文件都是以二进制补码的形式存在,问题也就来了。
第一个问题 如果我们给一个无符号的数赋值一个负数,他会读取到什么,又会输出什么?(似乎问题和上面的话没关系啊,嘘!往下看!)
首先来说编译器并不会报错,但是具体的内存操作就要和我们刚才说的有关系了,比如我们在存储一个负数
它会以 负数——转反码——转补码 存储到计算机中。
我们可以看上面的程序,在无符号的字符型里面我们给他赋值-1而输出是255。
为什么那?原因如下。在我们输入的-1的时候,计算机会将这个-1存储为负数的补码
也就是 源码: 1000 0001
反码:1111 1110
补码:1111 1111
特别说明:反码就是符号位不变,其他位取反。可能你会说,这还用你教,原因是作者本人当年在学源码 反码 补码的时候,生病了.
补码:是在反码的基础上加1.
好了。回到我们今天的主题。既然计算机会1111 1111 存储到计算机,那么读取的时候又是如何读取的那?
这就要注意了。我们是把一个负数存储到了无符号的变量里。计算机在输出的时候。一看要输出的变量类型是无符号类型
那么最高位计算机就会当成数据位。也就是255。
第二个问题是什么那?那就是溢出。我们知道char类型来说它的范围是-128~127
那么我们就想试试我给他个129,如何?
这次我们先来分析一下129存储到里面是什么样的。首先129是有符号的数。129是正数,正数的源码,反码,补码都是一样的。
1000 0001(源码 反码 补码)都一样哦!
好了我们把129也按补码存储到了内存,但是在读取的时候是什么样的那?读取的时候,由于是有符号的数据类型,最高位会当作符号位处理
那么最高位是1,就是代表负数。注意了,核心问题来了!
我们在读取的过程是存储过程的逆过程,我们在存储的时候 源码——》反码——》补码。在我们读取的时候 补码——》反码——》源码。(以前加1,现在减1变为反码)
当前我们最高位是1 计算机会当作负数处理,也就是在读取的时候要进行逆过程。
补码 1000 0001
反码 1000 0000
源码 1111 1111 (-127)
今天先就到这里吧!该吃饭了!
第三个问题就是涉及到了为运算 ~
具体问题就是如果我们对于一个普通变量比如 5 进行~结果会是什么?
结果为什么会是-6,我们来分析一下。
首先来说你的5是正数,那么存储到计算机中按照原反补码不不变
也就是: 0000 0101
按位取反 1111 1010
这个时候注意了:取反后你是有符号数 最高位为1表示负数,负数输出的时候要进行逆运算
也就是 补码:1111 1010
反码:1111 1001
源码:1000 0110 (-6)
结果是 -6也就一目了然了。
终上所述我们可以得到的结论就是一定要注意你的数输入后可是要进行转换的,输入的时候是原码转为补码。
读取的时候补码转为源码。而期间一切运算是在补码的基础上进行的。
【1】打开终端
1--- ctrl + ait + t //新打开一个终端
2--- ctrl + shift + n //在已打开终端前提下使用
3--- ctrl + shift + t //在已打开终端前提下使用
【2】linux @ ubuntu : ~ $
用户名 主机名 路径 命令提示符 ~ //家目录 ==》 /home/linux/
/ //根目录,linux底下一切文件的起源
$ //普通用户权限
# //超级用户权限
【3】ls
查看当前路径下的文件
【4】cd
路径切换
cd //直接切换到家目录
cd / //直接切换到根目录
cd 目录名 //切换到指定目录
cd .. //切换到上一级目录
cd - //切换到上一次目录
【4】su
切换用户的命令
su root //切换超级用户
exit //退出用户
【5】passwd
sudo //获取临时管理员权限
sudo passwd root //修改root用户的密码
【6】mkdir
mkdir 目录名 //创建目录
rmdir 目录名 //删除空目录
【7】touch
touch 1.txt //创建文件
【8】rm
rm 1.txt //删除文件
rm 目录名 -rf //删除目录
【9】ls
ls -l //以列表形式显示当前路径下文件的详细信息
ls -a //查看所有文件(包括隐藏文件)
d rwx rwx r-x 8 linux linux 4096 Mar 14 12:02 DIR
类型 权限 链接数 用户名 组名 文件大小 时间 文件名
【10】文件类型(7种)
一切皆文件的思想(bcd-lsp)
b //块设备文件
c //字符设备文件
d //目录
- //普通文件
l //链接文件
s //套接字文件
p //管道文件
【11】文件权限
rwx rwx r-x
r //可读权限
w //可写权限
x //可执行权限
第一组:用户本身权限
第二组:同组成员用户的权限
第三组:没有关系的其他用户权限
【12】
.. //上一级路径
. //当前路径
【13】echo
echo “hello” //向终端(标准输出)输出字符串
echo “ddd0”>>3.txt >>重定向输出
【14】VIM(编辑器)
1--- vi 3.txt
2--- 命令模式(Esc)
yy //复制
dd //剪切(删除一行)
p //粘贴
u //撤销
ctrl+r //反撤销
gg //光标移动到文件的第一行
G //光标移动到文件的末尾
noh noh查找高亮取消
3--- 输入模式(命令模式-->输入模式)
i //从光标所在位置前面开始插入资料
a //从光标所在位置后面开始插入资料
I //从光标列的第一个非空白字符开始插入资料
A //从光标所在行最后面的地方开始新增资料
o //在光标所在列下新增一列并进入输入模式
O //在光标所在列上方新增一列并进入输入模式
4--- 底行模式(Esc :)
w //保存
q //退出
wq //保存退出
w! //强制保存
q! //强制退出
vsp 1.txt //左右分屏显示
sp 1.txt //上下分屏显示
%s/hello/1234/g //将文件所有的“hello”替换成“1234”
7,14s/hello/HELLO/g //将文件7-14行的“hello”替换成“HELLO”
noh
【15】cat
cat 1.txt //将文件的内容打印到终端上
【16】cp
cp 1.txt filename //文件备份
cp 1.txt dirname //将文件复制到其他目录下
【17】mv
mv 1.txt .. //移动文件到上一级路径
mv 2.txt dirname
【18】GCC
1--- gcc 1.c //默认生成一个二进制a.out
./a.out //执行可执行文件
2--- gcc 1.c -o hello //指定输出一个hello的可执行文件
./hello
3--- 四步完整编译流程
预处理:主要进行宏替换以及头文件的包含展开
gcc -E Hello.c -o Hello.i
编译:编译生成汇编文件,会检查语法是否有错误
gcc -S Hello.i -o Hello.s
汇编:将汇编文件编译生成目标文件(二进制文件)
gcc -c Hello.s -o Hello.o
链接:链接库函数,生成可执行文件
gcc Hello.o -o Hello
4--- 两步编译流程
汇编:将汇编文件编译生成目标文件(二进制文件)
gcc -c Hello.c -o Hello.o
链接:链接库函数,生成可执行文件
gcc Hello.o -o Hello
【19】数值表示方式
man ASCII //查看ASCII码表
‘0’ 'A'~'Z' 'a' 'z' ‘\n’ 空格
48 65~90 97~ 122 10 32
‘\0’(字符串的结束标志)
0
大小写字符相差:32
【20】代码跟踪调试
__LINE__ //代码所在的行数
__FUNCTION__ //代码所在的函数
__FILE__ //代码所在的文件