示例
#include <stdio.h>
#include <stdint.h>int main(int argc, char **argv)
{uint8_t uint8_max = ~(uint8_t)0; /*!< 定义无符号字符型型的最大值 */int8_t int8_max = (int8_t)((uint8_t)(~1) >> 1); /*!< 定义有符号字符型的最大值 */uint32_t uint32_max = ~(uint32_t)0;int32_t int32_max = (int32_t)((uint32_t)(~1) >> 1);int8_t int8_min = ~int8_max;printf("Min of int8_t is 0x%X - %d\n", int8_min, int8_min);printf("Max of int8_t is 0x%X - %d\n",int8_max, int8_max);printf("Max of uint8_t is 0x%X - %u\n",uint8_max, uint8_max);printf("Max of int32_t is 0x%X - %d\n", int32_max, int32_max);printf("Max of uint32_t is 0x%X - %u\n", uint32_max, uint32_max);
}
root@seven:~/workspace/test/16.values# gcc value.c
root@seven:~/workspace/test/16.values# ./a.out
Min of int8_t is 0xFFFFFF80 - -128
Max of int8_t is 0x7F - 127
Max of uint8_t is 0xFF - 255
Max of int32_t is 0x7FFFFFFF - 2147483647
Max of uint32_t is 0xFFFFFFFF - 4294967295
解析
最大值
对于无符号整型数据,最大值即为每位
都是1
,所有可以使用位操作运算符~
(位非): <unsigned type> max = ~(<unsigned type>)0;
对于有符号整型数据,最大值为符号位为0
,其他位都为1
: <signed type> max = (<signed type>)((<unsigned type)(~1) >> 1);
,先取反,然后使用除2
或者右移一位的方式时最高位(符号位)为0
(正数),即得到有符号型数据最大值。
最小值
对于无符号整型数据,最小值即为0
;
对于有符号整型数据,最小值为能表示的最小负数,由于负数编码为补码表示,故最小值符号位为1
(负号),其他位全为0
: <signed type> min = ~(max);
——生活不会放弃你,但也不会放过你。