c,c++内存运行时深入研究
C/C++内存与运行时深入研究 [作者Jean.Love]
-----------------------------------------------------------------------------------
(一)整数符号的陷阱
(二)浮点数的本质
(三)堆栈的内存管理结构
(四)符号解析
(五)对齐和总线错误
(六)函数指针
(七)虚函数的实现机理
(八)引用的实现机理
(九)虚拟继承对象的内存结构
(十)混合编程时的初始化顺序
(十一)数组和指针的异同
(十二)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\n",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\n",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\n",ii,jj);
if(ii>1){printf("100000");}
if(jj>1){printf("100001");}
return 0;
}
用gcc -S得到汇编,会发现if(ii>1)和if(jj>1)对应两个不同的跳转指�
相关文档:
谈谈C语言的malloc()和free()
一、malloc()和free()的基本概念以及基本用法:
1、函数原型及说明:
void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)。
关于分配失败的原因,应该有多种,比如说空间不足就是一种。
void free(void *Fir ......
参考《linux内核完全注释》和网上相关文章
/*
* 控制台显示操作
*/
/*
* linux/kernel/console.c
*
* (C) 1991 Linus Torvalds
*/
/*
* console.c
*
* This module implements the console io functions
* 'void con_init(v ......
C/C++关键字static,const,inline,define,typedef
document.body.oncopy = function() {
if (window.clipboardData) {
setTimeout(function() {
......
C/C++是最主要的编程语言。这里列出了50名优秀网站和网页清单,这些网站提供c/c++源代码。这份清单提供了源代码的链接以及它们的小说明。我已 尽力包括最佳的C/C++源代码的网站。这不是一个完整的清单,您有建议可以联系我,我将欢迎您的建议,以进一步加强这方面的清单。
1、http://snippets.dzone.com/tag/c/ --数以千� ......