字节填充与对齐

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)
2010-02-25 22:51 | 阅读 809 次 | 评论 0 条

char类型的可移植性问题

1、ANSI C 标准没有规定char类型在默认情况下是有符号的还是无符号的,因此,由于隐式升级规则,将可能导致极端混乱的行为,如: char c ; c = 0xFF ; if( c == 0xFF) { //相关代码,此处是否执行将会取决于你的编译器 } 如果编译器将char类型当做有符号类型的话,将不会执行大括号里面的代码,由于隐式升级规则,char将升级为int型,也就是说,转换后,c的值为0xFFFFFFFF,和0xFF比较的话,当然是不等的。 如果是无符号的话,那将会测试成功。又如: char c ; while( (c = getcha...
2010-02-25 22:42 | 阅读 745 次 | 评论 0 条

位屏蔽的可移植性

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 &amp...
2010-02-25 22:10 | 阅读 755 次 | 评论 0 条
文章归档