c,c++内存运行时深入研究
(一)整数符号的陷阱
(二)浮点数的本质
(三)堆栈的内存管理结构
(四)符号解析
(五)对齐和总线错误
(六)函数指针
(七)虚函数的实现机理
(八)引用的实现机理
(九)虚拟继承对象的内存结构
(十)混合编程时的初始化顺序
(十一)数组和指针的异同
(十二)const限定的传递性
(十三)数据类型的限定性检查
(十四)使用STL时的类型限制
(十五)迭代器自身的类型
(十六)运行时的类型信息
(十七)new/delete重载
(十八)如何拷贝一个文件
(一)整数符号的陷阱
x
#include
int main(void){
int x=1;
unsigned int y=2;
int b=x
int b2=(x-y<0);
printf("%d,%d ",b,b2);
return 0;
}
它输出什么呢?
1,0
令人震惊,不是吗,x
(1)x
(2)x-y的结果计算的时候,返回一个0xfffffffe,它被当成无符号数字理解并和0比较,显然<0不成立,返回0。
总结一下,整数的运算,加减乘的时候,根本不管是否声明为是否有符号,在2进制cpu上面的计算是相同的,但是比较的时候(<,>,==)会根据类型,调用不同的比较指令,也就是以不同的方式来理解这个2进制结果。当signed和unsigned混用的时候,全部自动提升为无符号整数。
#include
int main(void){
int i=-2;
unsigned j=1;
if(j+i>1) //提升为两个uint相加
printf("sum=%d ",j+i);//打印的结果根据%d制定,j+i的内存值永远不变。
return 0;
}
输出
> ./a.out
sum=-1
再举一个例子
#include
int main(void){
int i=-4;
unsigned int j=1;
int ii=i+j;
unsigned int jj=i+j;
printf("%d,%ud ",ii,jj);
if(ii>1){printf("100000");}
if(jj>1){printf("100001");}
return 0;
}
用gcc -S得到汇编,会发现if(ii>1)和if(jj>1)对应两个不同的跳转指令jle和jbe。
总结: int和unit在做比较操作和除法的时候不同,其他情况相同。
返回页首
(二)浮点数的本质
&n
相关文档:
使用 C# 2.0 命令行编译器
http://msdn.microsoft.com/zh-cn/library/ms379563(vs.80).aspx#mainSection
摘要:本文分析了使用 C# 命令行编译器 csc.exe 生成应用程序的过程。同时,还将向读者介绍很多为 C# 2.0 独有的编译器选项,例如,extended/reference 标志和强名称支持。阅读完本文的内容之后,您将能够轻松地在没 ......
extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字创意产品网 .
它告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。
1。对于extern变量来说,仅仅是一个变量的声明,其并不是在定义分配内存空间。如果该变量定义多次,会有连接错误
2。通常,在模块的头文件中对本模块提供给其它模块 ......
命令行界面的程序,通常都需要输入命令行参数帮助程序执行。main是最典型的此类应用,main的参数之前都被忽略掉了。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int count;
printf("The command line has %d arguments:\n", ......
#include <stdio.h>
#define LL unsigned long long int
inline LL mod(LL a,LL b)
{
while (a>=b)
a-=b;
return a;
}
//a*b mod c
inline LL MulAndMod(LL a, LL shl_b,LL c)
{
LL val,pre;
pre = mod(a,c);
val = 0;
......
Linux中的进程通信
1.管道
函数原型:int pipe(int filedes[2]);
函数返回值: 正确返回0;错误返回-1
其中的文件描述符filedes[0]是用来读取数据的,filedes[1]是用来写数据的。
例子1:
#include<stdio.h>
#include<stdlib.h>
#include<u ......