C语言中的基本整型数据类型

整型家族包括字符、短整型、整型、长整型,它们都分为有符号和无符号两种版本

整型值相互之间的大小的规则:

长整型至少应该和整型一样长,而整型至少应该和短整型一样长

一般情况下各种类型在32、64位机上的大小

img

long,unsigned long pointer为机器全字长,其实也就是这几种类型的大小和CPU的位数是一样的。

下面的程序是在X86架构环境上,使用gcc version 4.7.2 20121109 (Red Hat 4.7.2-8) (GCC)编译得到的

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#include <stdio.h>

int main()
{
        printf("the char range is           %-20hhd~%20hhu, size is %u\n", 0x80, 0x7f, sizeof(char));
        printf("the usigned char range is   %-20hhu~%20hhu, size is %u\n", 0x0, 0xff, sizeof(unsigned char));
        printf("the short range is          %-20hd~%20hu, size is %u\n", 0x8000, 0x7fff, sizeof(short));
        printf("the unsigned short range is %-20hu~%20hu, size is %u\n", 0x0, 0xffff, sizeof(unsigned short));
        printf("the int range is            %-20d~%20u, size is %u\n", 0x80000000, 0x7fffffff, sizeof(int));
        printf("the unsigned int range is   %-20u~%20u, size is %u\n", 0x0, 0xffffffff,  sizeof(unsigned int));
        printf("the long range is           %-20ld~%20lu, size is %u\n", 0x80000000, 0x7fffffff, sizeof(long));
        printf("the unsigned long range is  %-20lu~%20lu, size is %u\n", 0x0, 0xffffffff, sizeof(unsigned long));
        printf("the llong range is          %-20lld~%20llu, size is %u\n", 0x8000000000000000, 0x7fffffffffffffff, sizeof(long long));
        printf("the unsigned llong range is %-20lld~%20llu, size is %u\n", 0x0ll, 0xffffffffffffffff, sizeof(unsigned long long));
        printf("default constant size is %u %u %u\n", sizeof('b'), sizeof(0x0), sizeof(0x0ll));
}

运行结果

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
the char range is               -128         ~         127, size is 1
the usigned char range is        0          ~         255, size is 1
the short range is              -32768        ~        32767, size is 2
the unsigned short range is      0          ~        65535, size is 2
the int range is               -2147483648     ~      2147483647, size is 4
the unsigned int range is        0          ~      4294967295, size is 4
the long range is              -2147483648     ~      2147483647, size is 4
the unsigned long range is       0          ~      4294967295, size is 4
the llong range is             -9223372036854775808~ 9223372036854775807, size is 8
the unsigned llong range is      0          ~18446744073709551615, size is 8
default constant size is         4 4 8

整型字面值(整型常量)

字面值这个术语是字面值常量的缩写——这是一种实体,指定了自身的值,并且不允许发生改变。

当程序内出现整型常量时,它是属于整型家族类型中的哪一种?答案取决于常量是如何书写的,可以在有些常量的后面添加一个后缀来改变缺省规则。在整数常量后面添加L或l,可以使这个整数被解释为long整型值,字符U或u则用于把数值指定为unsigned 整型值,如果一个常量后面添加这两个字符中的各一个,那么它就被解释为unsigned long整型值。对于字符常量。它们的类型总是int。不能再它们后面添加unsigned或者long后缀

printf格式化的原则

C语言一般默认整型常量(字符常量/整型常量)类型为int,

如果使用格式字符%llu,printf会认为要输出的这个值的大小为8字节,所以如果对应的参数如果为0x0的话则有可能打印出乱七八糟的东西(因为它读了8个字节而不是4个字节)

另外printf打印整型变量时,打印的是有符号还是无符号取决于格式字符,与实际传入的参数类型及符号无关。

例如

1
2
3
4
5
6
int i = 0x80001010;
printf("%d\n", i);  //打印-2147479536 
printf("%u\n", i);  //打印2147487760
printf("%hu\n",i);  //打印4112,高位两字节被截断,打印的实际是0x1010

printf("%hhu\n",i); //打印16,高位三字节被截断,打印的实际是0x10

所以请谨记使用printf打印变量的值与该变量的符号和变量本身无关,即使强转也不行!是有printf的格式字符决定的,应选择对应正确的格式字符