#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )

_INTSIZEOF(n)整个做的事情就是将n的长度化为int长度的整数倍。
比如n为5,二进制就是101b,int长度为4,二进制为100b,那么n化为int长度的整数倍就应该为8。
~(sizeof(int) - 1) )就应该为~(4-1)=~(00000011b)=11111100b,这样任何数& ~(sizeof(int) - 1) )后最后两位肯定为0,就肯定是4的整数倍了。
(sizeof(n) + sizeof(int) - 1)就是将大于4m但小于等于4(m+1)的数提高到大于等于4(m+1)但小于4(m+2),这样再& ~(sizeof(int) - 1) )后就正好将原长度补齐到4的倍数了。

时间: 2024-10-14 00:51:24

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

((sizeof(n)+sizeof(int)-1)&~(sizeof(int)-1))的含义

微信公众号:郑尔多斯 关注「郑尔多斯」公众号 ,回复「领取资源」,获取IT资源500G干货.升职加薪.当上总经理.出任CEO.迎娶白富美.走上人生巅峰!想想还有点小激动 关注可了解更多的Nginx知识.任何问题或建议,请公众号留言;关注公众号,有趣有内涵的文章第一时间送达! 前言 在nginx的代码中经常出现类似((sizeof(n)+sizeof(int)-1)&~(sizeof(int)-1))的代码,这部分代码的作用是什么呢?本文分析一下它的神奇之处.本文主要参考文章末尾的两个链接,并稍作

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

This interview question come from a famous communication firm of china. : ) 1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <conio.h> 5 using namespace std; 6 7 int main() 8 { 9 float a = 1.0f; 10 11 cou

int *a[] 与(int *)a【5】的区别

*a[5] 是指针数组  可以指向5个值 (*a)[5]  是一个指针,但这个指针只能指向包含5个元素的一维数组 a是一个数组,每个元素都是个指针. b是一个指针,指向一个数组 1.int *a[5]:指针数组.本质是数组.sizeof(a)=20.sizeof计算数组的大小.5个int型即为20. sizeof(*a)=4.数组元素是指针.*a代表的是一个指针,此求的是int  型指针的大小为4. 2.int (*a)[5]:数组指针.本质是指针.sizeof(b)是求int型指针的大小为4.

c语言将字符串转成int,将int转成字符串。附带任意进制转换函数

在网上看到各种将字符串转成int,和int转成字符串的方法.我自己比较喜欢用的方法是下面的,记住模板就行,最开始我也老是记不住,找到规律,多用几遍就好了. 1.将字符串转成int char s[20] = "123456";   // 注如果此处不是数字字符串类型,如下面的字符串  12abc -->  12        ab12 --> 0 int a = 0; sscanf(s,"%d",&a);   // a = 123456   就得到

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

转自:http://paddy-w.iteye.com/blog/1403217 在Linux操作系统下使用GCC进行编程,目前一般的处理器为32位字宽,下面是/usr/include/limit.h文件对Linux下数据类型的限制及存储字节大小的说明.  /* We don't have #include_next.   Define ANSI <limits.h> for standard 32-bit words.  */     /* These assume 8-bit 'char'

int main() 与 int _tmain()

用过C的人都知道每一个C的程序都会有一个main(),但有时看别人写的程序发现主函数不是int main(),而是int _tmain(),而且头文件也不是<iostream.h>而是<stdafx.h>,会困惑吧? 一起来看看他们有什么关系吧(_tmain()是unicode版本的main()) 首先,这个_tmain()是为了支持unicode所使用的main一个别名而已,既然是别名,应该有宏定义过的,在哪里定义的呢?就在那个让你困惑的<stdafx.h>里,有这么

const int *a和int *const a的区别

关键问题点:const 属于修饰符 ,关键是看const 修饰的位置在那里1.const int *a 这里const 修饰的是int,而int定义的是一个整值 因此*a 所指向的对象 值 不能通过 *a 来修改,但是 可以重新给 a 来赋值,使其指向不同的对象 eg:        const int *a = 0;        const int b = 1;        int c = 1;       a = &b  //  额外:注意不能通过a 来修改 b值       a = &a

C++中 int i 与 int &amp;i 注意事项

来源:http://blog.csdn.net/qianchenglenger/article/details/16949689 1.int i 传值,int & i 传引用 int i不会回带参数,而int &i可以回带参数,如 [cpp] view plain copy #include <iostream> void test1(int i) { i = 7; } void test2(int &i) //要限制参数改动,可以加const限制 { i = 7; }

mysql中int(1)与int(10)的区别

INT[(M)] [UNSIGNED] [ZEROFILL] 普通大小的整数.带符号的范围是-2147483648到2147483647.无符号的范围是0到4294967295. INT(1) 和 INT(10)本身没有区别,但是加上(M)值后,会有显示宽度的设置. 如代码所示: mysql> create table test(id int(3)); Query OK, 0 rows affected (0.47 sec) mysql> insert into test values(12)

int(1)和int(11)的区别

在cmd中进入数据库中 creata table t(x int(1) zerofill,y int(11) zerofill); insert into t(x,y) values(1,1); select x,y from t; 然后我们再创建一张表 我们比较一下可以发现int(1)和int(11)使用zerofill后两者才会有所区别,当没有加zerofill时候两者是没有任何区别的. 因此当结合可选扩展属性zerofill使用时, 默认补充的空格用零代替.例如,对于声明为INT(5) z