1、如该结构体:
struct foo
{
int i ;
char c[2] ;
short s ;
}
现在假设int是32位,char是8位,short是16位,sizeof(foo)将会是多少呢?直观上认为是4+2+2为8字节,可是在许多体系结构上,访问自然对齐的数据元素的速度则比较快,因此,编译器将会按照最佳对齐情况的需要填充字节。如果是4字节对齐,则sizeof(foo)将等于12.
microsoft visual c++有提供#pragma pack来指定对齐方式
如:#pragma pack(8)
1、ANSI C 标准没有规定char类型在默认情况下是有符号的还是无符号的,因此,由于隐式升级规则,将可能导致极端混乱的行为,如:
char c ;
c = 0xFF ;
if( c == 0xFF)
{
//相关代码,此处是否执行将会取决于你的编译器
}
如果编译器将char类型当做有符号类型的话,将不会执行大括号里面的代码,由于隐式升级规则,char将升级为int型,也就是说,转换后,c的值为0xFFFFFFFF,和0xFF比较的话,当然是不等的。
如果是无符号的话,那将会测试成功。又如:
char c ;
while( (c = getcha...
1、不要认为数字常量在所有平台上的表示都是相同的,例如,-1和0xFFFFFFFF是一样的,可并不总是如此,只有在32位系统上才是等价的,在64位系统上表示的是很大很大的正数。
2、位屏蔽,如想屏蔽低四位:
(1)nonportable code
unsigned long x = some_vaue ;
x &= 0xFFFFFFF0 ; // this code is absolutely wrong on 64 bits platform ;
(2)portable code
unsigned long x = some_value ;
x &...