C语言中整形在计算机中的存储

    xiaoxiao2021-03-26  27

    整形包括字符、短整形、整形、长整形,整形的存储方式都是一样的,整形在存储时都是以补码进行存储的。

    下面用char来解释:

     

    signed char          -128 127

    unsigned char        0 255

    short int            -32768 32797

    unsigned short int     0 65535

     

     

    Char

    Char类型其实也是一种整形,因为char的每个字符都是由0255的整形数字来表示的;

    ANSI C提供了charsigned charunsigned char三种字符类型;

    它们都是按照一个字节存储的,可以保存256个不同的值;

    unsigned char无符号的整形存储简单,因为正整数的原反补码相等,范围是0到255,直接存入相应的二进制。

     

    signed char 的取值范围在-128+127,为什么在这个范围呢?

    计算机在存储数据都是以数据的补码来进行存储,有符号类型存储是,最高被当做符号位,01负,所以signed char取值范围在

    -(2^7)-1+(2^7)-1 ,但是发现这个值是-127+127这是因为+0-0被计算了两次,但实际情况0只有一个,计算机一般把+0当做零,把-0当做-128,所以signed char 的取值范围是-128+127

    这里计算机是怎样把-0识别为-128?

    因为系统识别到最高位是1后面全0的情况,系统会在最高位自动添加一个符号位,所以-128具有9bit

    -128在存入内存的时,因为char只有8bit位,所以读取低8位,结果是1000 0000

    -0的二进制序列一样,所以就用-128表示-0;系统识别1000 0000 时就会自动添加一个符号位,就是-128了。(在这里计算时符号位参与运算)

    原码    1 1000 0000

    反码    1 0111 1111

    补码    1 1000 0000

     

    下面看几个有关理解整形存储的代码:

    #include<stdio.h> #include<windows.h> int main() { unsigned char a = -1; signed char b= -1; char c = -1; printf("a=%d b=%d c=%d\n", a, b,c); system("pause"); return 0; }

    signed char型提升为int型打印时,char补码的符号位前面要全补成和char相同的符号位,然后在把最高位当做符号位,求原码。

    #include<stdio.h> #include<windows.h> int main() { char a = 128; char b = -128; printf("a = %u\nb = %u\n", a,b); system("pause"); return 0; }

    不论是128 还是-128保存到cahr a里面都是读取补码的低8位即1000 0000

    a解释用于打印的时候会把最高位(第八位)作为符号位即1,所以 char 提升为unsigned int类型,char的符号位前面的根据char类型全补成1。 然后以无符号整形输出。

    转载请注明原文地址: https://ju.6miu.com/read-662670.html

    最新回复(0)