转载:http://blog.chinaunix.net/uid-20608849-id-3027953.html
内核为了保持最大的兼容性和代码灵活性,不可能直接对某个数据类型定义它的大小范围。但是很多时候又要用到这些最大值最小值或者该数据类型可以表示的数据范围,比如初始化一个值为最大/小值,或者检验数据是否位于某个类型的范围内。
 1 include/linux/kernel.h
 2 #define USHORT_MAX ((u16)(~0U))
 3 #define SHORT_MAX ((s16)(USHORT_MAX>>1))
 4 #define SHORT_MIN (-SHORT_MAX - 1)
 5
 6 #define INT_MAX ((int)(~0U>>1))
 7 #define INT_MIN (-INT_MAX - 1)
 8 #define UINT_MAX (~0U)
 9
10 #define LONG_MAX ((long)(~0UL>>1))
11 #define LONG_MIN (-LONG_MAX - 1)
12 #define ULONG_MAX (~0UL)
13
14 #define LLONG_MAX ((long long)(~0ULL>>1))
15 #define LLONG_MIN (-LLONG_MAX - 1)
16 #define ULLONG_MAX (~0ULL)

内核通过C语言的强制转换来实现,首先定义无符号数的最大值,比如USHORT_MAX。然后去掉符号位可以得到该类型有符号的最大值,而最小值的绝对值则比最大值的大1,所以通过对有符号的最大值取反减1,就可以得到有符号的最小值。根据这一规则可以很容易写出char类型的相关数据大小。转换的原理从下图中可以更清晰的看出来:

根据Linux对short,int,long以及long long数据类型大小的定义,可以很容易定义出char型的数据大小,示例如下:

 1 #include <stdio.h>
 2
 3 #define UCHAR_MAX ((unsigned char)(~0U))
 4 #define CHAR_MAX ((char)(UCHAR_MAX >> 1))
 5 #define CHAR_MIN (-CHAR_MAX - 1)
 6
 7 int main()
 8 {
 9   printf("UCHAR_MAX:\t%u\n", UCHAR_MAX);
10   printf("CHAR_MAX:\t%d\n", CHAR_MAX);
11   printf("CHAR_MIN:\t%d\n", CHAR_MIN);
12
13   return 0;
14 }

得到如下结果:

1 UCHAR_MAX:    255
2 CHAR_MAX:    127
3 CHAR_MIN:    -128

转载于:https://www.cnblogs.com/3me-linux/p/6208016.html

linux tricks 之数据对齐。相关推荐

  1. linux下的数据对齐

    数据对齐也就是通过硬件来估算在数据的地址和内存块之间的联系.当一个数被装载进内存,它的内存地址是它的数据大小的倍数,这个就是自然对齐.比如一个32位的数据,他被装载进内存的地址就是4的倍数,也就是地址 ...

  2. Nginx源码分析--数据对齐posix_memalign和memalign函数

    posix_memalign函数() /*  * 背景:  *      1)POSIX 1003.1d  *      2)POSIX 标明了通过malloc( ), calloc( ), 和 re ...

  3. Linux内核网络数据包发送(三)——IP协议层分析

    Linux内核网络数据包发送(三)--IP协议层分析 1. 前言 2. `ip_send_skb` 3. `ip_local_out` and `__ip_local_out` 3.1 netfilt ...

  4. 【转】彻底搞清计算结构体大小和数据对齐原则

    数据对齐: 许多计算机系统对基本数据类型合法地址做出了一些限制,要求某种类型对象的地址必须是 某个值K(通常是2,4或8)的倍数.这种对齐限制简化了形成处理器和存储器系统之间的接口的硬件 设计.例如, ...

  5. gcc数据对齐之: howto 2.

    原文链接:http://www.catb.org/esr/structure-packing/ 谁应阅读本文 本文探讨如何通过手工重新打包C结构体声明,来减小内存空间占用.你需要掌握基本的C语言知识, ...

  6. Linux 系统挂载数据盘

    Linux 系统挂载数据盘:   适用系统:Linux(Redhat , CentOS,Debian,Ubuntu) *  Linux的云服务器数据盘未做分区和格式化,可以根据以下步骤进行分区以及格式 ...

  7. Linux下的数据备份工具rsync

    Linux下的数据备份工具很多,用得最多的是rsyns(远程同步) 同步远程数据类似scp 同步本地数据类似cp root@ip-172-31-8-212:~# rsync /etc/passwd / ...

  8. 内存对齐/字节对齐/数据对齐/地址总线对齐

    其实是使用InitializeAcl()时发现有个aligned,可我不知道什么是aligned 于是乎我就先搜索了对齐,结果发现了一大堆,什么[字节对齐].[内存对齐].[地址总线 对齐].[数据对 ...

  9. MediaCodec 解码后数据对齐导致的绿边问题

    前言 本文从简书迁移,原文地址:www.jianshu.com/p/ac53e9595- Android 使用 MediaCodec 解码 h264 数据后会有个数据对齐的问题. 简单说就是 Medi ...

  10. Linux系统捕获数据包流程

    Linux系统捕获数据包流程 为了提高数据包的捕获效率,瓶颈问题是一个需要非常关注的焦点.减少在捕获数据包过程中的瓶颈,就能够提高数据包捕获的整体性能.下面本文将以Linux操作系统为平台,分析捕获数 ...

最新文章

  1. 内核数据结构之红黑树
  2. 武汉网络推广介绍如何通过简化标题来提升主关键词排名?
  3. 【Visual C++】游戏开发笔记二十一 游戏基础物理建模(三) 摩擦力系统模拟
  4. java类加载器_类加载器
  5. 用函数求C15的值C语言,南开19春学期(1503、1509、1603、1609、1703)《C语言程序设计》在线作业-1辅导资料.docx...
  6. pytorch---张量和自动求导
  7. 定时任务schedule(spring boot )
  8. SendMessage,PostMessage
  9. 局域网攻击之ARP网关欺骗
  10. 编程:Python实现图片识别
  11. Art of Problem Solving: Proof without Words
  12. 软负载均衡和F5负载均衡(硬负载均衡)区别
  13. docker服务假死解决方案
  14. 年度盘点 | 2019品牌营销围绕的三个关键词
  15. 《A fast parallel algorithm for thinning digital patterns》论文算法python代码实现
  16. 石头机器人拖地水量调节_用石头扫地机器人扫地拖地是一种什么体验
  17. Qt QString 增、删、改、查、格式化等常用方法总结
  18. 利用Java抓取网页数据
  19. 并发-MESI缓存一直协议详解
  20. 荣耀Play6T配置怎么样 荣耀Play6T值得买吗

热门文章

  1. linux系统u盘安装7.2,U盘安装CentOS 7系统的方法
  2. java实践_java基础实践
  3. mysql优化必知(mysql的语句执行顺序)
  4. 太原市智能家居行业协会成立
  5. 使用浏览器去检查exchange 2013 协议的健康状况
  6. 单个用户OWA登陆失败,提示用户名和密码错误
  7. SAP QM 可以控制到没有收到Vendor 的certificate的话就不能做UD.
  8. 细算经典网游私服新作下刀的“手术”
  9. FreeRTOS的HOOK,以及(23)FreeRTOS 空闲任务分析
  10. 3月4日 投影变换、仿射、Cross Ratios交比与单目测距、投影变换代码实现logo与球筐融合