数据类型:整数

1.C的数据类型

没有特殊需要,就用int类型

 


 


  • sizeof
  • 一个字节(byte)有8位(8个bit)

    

int a = 1;
printf("sizeof(a)=%ld\n", sizeof(a)); //sizeof(a)=4
printf("sizeof(a+1)=%ld\n", sizeof(a)); //sizeof(a+1)=4,a=1
printf("sizeof(a+1.0)=%ld\n", sizeof(a+1.0)); //sizeof(a+1.0)=8,a=1

 



 

2.整数类型

  2.1 对于整数有:char、short、int、long、long long 五种类型,其中int类型字长与计算机CPU寄存器有关,32位的则为4字节,64位的则为8字节。

  

   2.2 整数在计算机中的表示:关于补码,-1用1111 1111表示,1仍用0000 0001表示,则1 + -1 = 0 表示为0000 0001 + 1111 1111 = 1 0000 0000,多出来的一位1被丢掉,即为8位的0。

  补码的意义:即补码+原码(如-1为原码1的补码)的和得到一个带溢出的0。所以在二进制计算中对于a + (-b),只要用b的补码去代替(-b)做二进制加法就可以了。 

  如128为2的7次方,即为1000 0000,那么-128就是0-128,即为1 0000 0000 - 1000 0000 = 1000 0000。

    

  2.3 数的范围、整数越界

  

  对于signed int,1开头的表示负数,除了0000 0000外的0开头的表示正数。

  

//关于补码
#include <stdio.h>

int main()
{
    char c = 255;  //char为1个字节,默认为带补码的范围,即表示范围为-128~127
    // unsigned char c = 255;  //前面加上unsigned就表示不带补码的范围,此时二进制1111 1111就表示255,printf的结果c=255
    int a = 255;   //int为4个字节,带补码的范围为-(2^(32-1))~2^(32-1)-1
    printf("c=%d,a=%d\n", c, a ); //c=-1,a=255
    return 0;
}

   

    

 

//关于整数越界
#include <stdio.h>

int main()
{
    char c = 127;  //char为1个字节,默认为带补码的范围,即表示范围为-128~127
 // unsigned char c = 255;  //unsigned后,二进制1111 1111就表示255,c+1则为256,256的二进制为1 0000 0000,越界了即为0000 0000,即为0,故printf输出c=0  
    c = c + 1;
    printf("c=%d\n", c ); //c=-128
    return 0;
}

 

  2.4 整数的格式化输入与输出

  • 整数的输入输出只有两种形式:int 或者 long long
    • %c:char
    • %h:short    %hd以十进制打印short、 %hx以十六进制打印short、 %ho以八进制打印short
    • %d:int 如果系统性int和long的sizeof相同,则打印long用%d也可以,但是移植到其他不相同的系统中可能出现问题。
    • %u:unsigned int
    • %ld:long     %lx  以十六进制打印long、%lo  以八进制打印long
    • %lld:long long
    • %llu:unsigned long long
//关于整数输入输出
#include <stdio.h>

int main()
{
    char c = -1;  //char为1个字节,默认为带补码的范围,-1即为1111 1111
    int a  = -1;  //int为4个字节,-1即为1111 1111 1111 1111 1111 1111 1111 1111,即为十进制数4294967295
    printf("c=%u, a=%u\n", c, a ); // unsigned 输出结果为c=4294967295, a=4294967295
    /* c虽然为char,一个字节,但输出%u为int类型,故自动补上剩余的1,即32个1 */
    return 0;
}
  • 一个以0开头的数字字面量是8进制数
  • 一个以0x开头的数字字面量是16进制数
  • 输入012计算机会自动识别其为8进制数,并按对应的二进制数存储
  • 输入0x12计算机会自动识别其为8进制数,并按对应的二进制数存储
  • 想要输出8进制数用%o,想要输出16进制数用%x或%X,但没有前缀0和0x
  • 想要输出8进制数012用%#o或0%o,想要输出16进制数0x12用%#x或0x%x
//关于整数8进制数与16进制数
#include <stdio.h>

int main()
{
    char c = 012;  //8进制数
    int a  = 0x12; //16进制数  
    printf("c=%d, a=%d\n", c, a ); // 输出结果十进制为c=10, a=18
    return 0;
}

 

posted @ 2023-08-01 00:15  园友3218619  阅读(31)  评论(0)    收藏  举报