有符号和无符号类型函数用例,源码反码补码的使用

例一:

#include<stdio.h>
int main()
{
    /* *///
    char a = -1;
    signed char b = -1;
    unsigned char c = -1;
    printf("a=%d,c%d,c=%d", a, b, c);

    return 0;
}

输出为:

a=-1,c=-1,c=255

在32位操作系统中:

-1的源码:1000000000000000000000000001

       反码:11111111111111111111111111111110(  符号位不变,其他取反)     

       补码:11111111111111111111111111111111(反码+1)

char 类型的a,b,c只占八个字节,会发生截断,所以只放8个字节的字符

char a->11111111           (char-->signed char)

signed char b->11111111

unsigned char c->11111111

当把a,b,c要变成整型变量被打印出来时,会发生整型提升

a:(有符号类型前方补符号位)11111111111111111111111111111111(补码)

                                                    1000000000000000000000000001(-1源码)

b:(有符号类型前方补符号位)11111111111111111111111111111111(补码)

                                                    1000000000000000000000000001(-1源码)

c:(无符号类型高位补0):00000000000000000000000011111111

                                                  (正数源码反码补码一样,以源码读出255)

例二:

#include<stdio.h>
int main()
{
    char a = -128;
    printf("%u", a);

    return 0;
}

输出:4294967168

-128源码:10000000000000000000000000001000000

       反码:1111111111111111111111111111111101111111

       补码:111111111111111111111111111111111000000

       截断:1000000          (十进制为128)

       整型提升:1111111111111111111111111000000 (十进制4294967168)

(有符号高位补符号位,但用无符号输出,于是提升后第一位就不看成符号位)

例三:

#include<stdio.h>
int main()
{
    int i = -20;
    unsigned int j = 10;
    printf("%d\n", i + j);
    return 0;
}

输出:-10

-20源码:10000000000000000000000000010100

-20烦码:111111111111111111111111111111101011

-20补码:111111111111111111111111111111101101

 10补码:00000000000000000000000000001010

-20+10补码相加:111111111111111111111111111111110110

源码:10000000000000000000000000001010(十进制-10)

例四:

#include<stdio.h>
#include<windows.h>

int main()
{
    unsigned int i;
    for(i = 9; i >= 0; i--)
    {
        printf("%u\n", i );
        Sleep(1000);
    }
    
    
    return 0;
}

输出:

9
8
7
6
5
4
3
2
1
0
4294967295
4294967294
4294967293
4294967292
4294967291
4294967290
4294967289
4294967288
4294967287

......

当循环运行到i=0时;i--,-1后被放入一个无符号整型中,符号位被忽略读出的十进制数为4294967295,大于0进入新的循环,以此类推,i永远大于0,循环无法停止

-1的补码为11111111111111111111111111111111

例五:

#include<stdio.h>
int main()
{
    char a[1000];
    int i;
    for (i = 0; i <= 1000; i++)
    {

        a[i] = -1 - i;
    }
    printf("%d\n", strlen(a));

    return 0;
}

输出:255

 strlen识别到\0停止,也就时0,从-1开始到-128,127到0之间有128+127个字符

所以答案为255。


版权声明:本文为q1251191262原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。