1.2整数类型

1.2.1char型(8位)

char分为有符号型signed char和无符号型unsigned char。

      1.无符号型unsigned char范围0~255,下面是计算方法:

        最小0000 0000等于0;

        最大1111 1111,先加1等于10000 0000=2的8次方=256,再减1等于255。

      2.有符号型signed char范围是-128~127,下面是计算方法:

        0代表正,1代表负。

        最大值0111 1111先加1等于1000 0000=2的7次方=128,再减一等于127。

        最小值1000 0000等于-128(2的7次方)。

        一个字节(byte)等于8位(bit) 

下面让我们赋值char c1 = 128,为啥会输出-128呢?

具体解释:

1.二进制表示

        128 的二进制表示是 10000000。对于有符号的 char 类型,最高位(最左边的位)是符号位。10000000 表示的是 -128(在二进制补码表示中)。

2.赋值操作:

        当你执行char c = 128时,128被解释为char类型,由于超出了char的正数范围(-128~127),所以它会被截断并解释为-128。

3.输出:

        printf("%d",c); 会输出c的整数型,即-128

        printf("%c",c); 会输出c对应的ASCII字符。ASCII码-128对应的字符是非打印字符(通常显示为乱码或空白)。

总结:由于char类型范围是-128~127,赋值128会溢出,所以实际赋值变为-128。

因此printf("%d %c \n ",c,c); 会输出-128和一个非打印字符。

下面让我们赋值char c1 = 129,为啥会输出-127呢?

1.分析:char类型是有符号的8位整数,取值范围是-128~127,当赋值为129时已经发生了溢出。

129的二进制表示是10000001(8位),计算机在内存存储方式中是补码形式。

  • 对于有符号的 char 类型,最高位是符号位。10000001 被解释为补码,其对应的十进制值是:

    • 按位取反:01111110

    • 加 1:01111111

    • 结果是 -127。

因此,char c = 129;实际上会将C的值设置为-127。

2.输出结果

  • printf("%d", c); 会输出 c 的整数值,即 -127

  • printf("%c", c); 会输出 c 对应的 ASCII 字符。ASCII 码 -127 对应的字符是非打印字符(通常显示为乱码或空白)。

3.实际运行结果

这里需要注意的是char类型是否默认是有符号型(signed char)还是无符号型(unsigned char)是由编译器实现定义的,一般是默认有符号型!!!

那如何明确指定char类型呢?

为了避免歧义,可以显式指定 char 的类型:

  • 使用 signed char 明确表示有符号字符。

  • 使用 unsigned char 明确表示无符号字符。

大家可以使用以下代码来确定自己的编译器是否是默认有符号型(signed char)

#include <stdio.h>
int main()
{
    char c = -1;
    if (c < 0) {
        printf("char is signed.\n");
    } else {
        printf("char is unsigned.\n");
    }
    return 0;
}

  • 如果输出 char is signed.,则说明 char 默认是有符号的。

  • 如果输出 char is unsigned.,则说明 char 默认是无符号的。

下图为我的编译器code blocks是默认char为有符号型(signed char)

 下面让我们赋值unsigned char c = -1,为啥会输出255呢?

-1的补码计算步骤:

  1. 绝对值1

  2. 二进制表示00000001

  3. 取反11111110

  4. 加111111110 + 1 = 11111111

  5. 所以-1的补码是1111 1111

程序和结果显示如下图所示 

  • unsigned char c = -1;-1 被解释为 255,因为 unsigned char 是无符号类型。

  • printf("%d %c \n", c, c);%d 输出 255%c 输出 255 对应的字符

下图为ASCII码图

补充:二进制是逢二进一,八进制是逢八进一,十进制,十六进制以此类推。

二进制:0 1 10 11 20 21 30 32.......

八进制:0 1 2 3 4 5 6 7

              10 11 12 13 14 15 16 17 

              20 21 22 23 24 25 26 27.......

十进制:0 1 2 3 4 5 6 7 8 9

              10 11 12 13 14 15 16 17 18 19

               20 21 22 23 24 25 26 27 28 29......

十六进制:0 1 2 3 4 5 6 7 8 9 A B C D E F

                  10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F

                  20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值