原文

功能:

首先,sizeof(int)肯定是2的次方数,比如32位是4,64位是8

((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) ) 
的意思就是,如果sizeof(n)是sizeof(int)的倍数,则保持不变,否则返回最小的,大于sizeof(n)的,sizeof(int)的倍数。
比如,如果sizeof(int)是4,那么sizeof(n)是1-4的时候返回4,5-8的时候返回8,以此类推

实现:

首先sizeof(int)写成2进制是1后面若干个0,假设是n个0
sizeof(int) - 1 就是n个1,
取非再和前面的数取与就是清除掉前面那个数的后面n比特。
如果sizeof(n) 后面n比特都是0,那么加sizeof(int)-1不进位,相当于加上再清除掉。
如果sizeof(n) 后面n比特至少有1位是1,那么加了之后会往前进1,相当于sizeof(n)  右移n位,加1,再补充上n个0。

例子:

int - 4                 : 0000 0100    //n=2

sizeof(int) - 1             : 0000 0011

~                   : 1111 1100

如果sizeof(n) 后面n比特都是0       :  xxxx xx00   + 0000 0011 = xxxx xx11 然后后两位清零 -> xxxx xx00   //4的倍数

如果sizeof(n) 后面n比特至少有1位是1  : xxxx xx01 + 0000 0011 == 00xx xxxx + 0000 0001 再补零

#define _INTSIZEOF(n) ((sizeof(n)+sizeof(int)-1)&~(sizeof(int) - 1) )的更多相关文章

  1. sizeof(int *) 和 sizeof(int)型的大小问题

    小问题,暂时记录注意一下   printf("sizeof(int): %d\n", (int)sizeof(int));     printf("sizeof(int ...

  2. C++ 对数组sizeof 和对数组元素sizeof

    这一段程序 下面这段程序很有看点://arr1 is an array of intsint *source=arr1;size_t sz=sizeof(arr1)/sizeof(*arr1);//n ...

  3. what is difference in (int)a,(int&)a,&a,int(&a) ?

    This interview question come from a famous communication firm of china. : ) #include <iostream> ...

  4. (转载)(int)a、&a、(int)&a、(int&)a的区别,很偏僻的题

    #include <iostream>#include <stdio.h>#include <string.h>#include <conio.h>us ...

  5. (int)a、&a、(int)&a、(int&)a的区别,很偏僻的题

    (int)a.&a.(int)&a.(int&)a的区别,很偏僻的题 #include <iostream> #include <stdio.h> #i ...

  6. 【C】二级指针探秘 & 星号的两种用法(1.与基本类型结合形成另一种类型,比如与int结合形成int* 2.取值操作)

    1)问题:二级指针到底是什么?怎么用的?怎么存放的? #include <stdio.h> #define TEST_ADDR 0x12FF40 void main() { int a = ...

  7. int *p()与int (*p)()的区别

    int *p()是返回指针的函数 int (*p)()是指向函数的指针   返回指针的函数: int *a(int x,int y); 有若干个学生的成绩(每个学生有4门课程),要求在用户输入学生序号 ...

  8. Linux基本数据类型大小——int,char,long int,long long int

    转自:http://paddy-w.iteye.com/blog/1403217 在Linux操作系统下使用GCC进行编程,目前一般的处理器为32位字宽,下面是/usr/include/limit.h ...

  9. int main() 与 int _tmain()

    用过C的人都知道每一个C的程序都会有一个main(),但有时看别人写的程序发现主函数不是int main(),而是int _tmain(),而且头文件也不是<iostream.h>而是&l ...

随机推荐

  1. 下载android sdk更新包离线安装解决方案

    本文转载自:http://xljboox.blog.163.com/blog/static/7628448320111159354738/ 第一次安装android sdk后进行开发包的更新,你应该了 ...

  2. mysql 数据库名含“-”

    跨数据库操作时,用反引号即可: insert into `tmi-ds`.knn_test(imagedata) select imagedata from tmidb.imagetable wher ...

  3. Python 变量和常量及数据类型

    一.变量的命名 变量由字母.数字和下划线组成.变量的第1个字符必须是字母或下划线. 二.变量的赋值 例: x = 1 三.局部变量 局部变量只能在函数或者代码段内使用. 四.全局变量 在函数之外定义的 ...

  4. 第八次作业(课堂实战)- 项目UML设计

    本次作业博客 团队信息 队名:起床一起肝活队 原组长: 白晨曦(101) 原组员: 李麒 (123) 陈德斌(104) 何裕捷(214) 黄培鑫(217) 王焕仁(233) 林志华(128) 乐忠豪( ...

  5. lintcode-391-数飞机

    391-数飞机 给出飞机的起飞和降落时间的列表,用 interval 序列表示. 请计算出天上同时最多有多少架飞机? 注意事项 如果多架飞机降落和起飞在同一时刻,我们认为降落有优先权. 样例 对于每架 ...

  6. NULL指针引起的一个linux内核漏洞

    NULL指针一般都是应用于有效性检测的,其实这里面有一个约定俗成的规则,就是说无效指针并不一定是 NULL,只是为了简单起见,规则约定只要指针无效了就将之设置为NULL,结果就是NULL这个指针被用来 ...

  7. OSG学习:用多通道(multiple passes)实现透明度

    osgFX库提供了一个用于多通道渲染(multi-pass rendering)的框架.每个你想要渲染的子图都应该被添加到osgFX::Effect节点,多通道技术的定义和使用都可以在这个节点中完成. ...

  8. 使用命令virsh管理网络设备,创建桥设备 和 使用virt-manager创建虚拟机

    # 1:查看网卡接口 virsh iface-list Name State MAC Address ------------------------------------------------- ...

  9. springmvc值传递

    1.页面向后台传值 A.HttpServletRequest方式: package com.rong.controller; import javax.annotation.Resource; imp ...

  10. PHP初级

    通过form  get post表单提交的数据,数据内容由用户填写或选择而得到!