整形数据类型在内存中的存储以及练习题

本文详细讲解了整形数据类型(如char、short、int、long)的有无符号区别,内存中原码、反码和补码的存储方式,以及大端和小端存储模式。特别关注了整数提升时的无符号补零和有符号补符号位,通过实例演示了char类型的数值在不同情况下的输出。
摘要由CSDN通过智能技术生成
1.整形数据类型包括
  char
  short
  int
  long
  分有符号和无符号
2.整形数据在内存中的存储
整形在内存中由二进制的形式存储,分原码反码和补码,第一位是符号位其余是数值位,符号位0为正,1为负;
正整数的原码反码和补码相同,
负整数的 原码 就是十进制直接转换二进制,反码 由原码除符号位其他位按位取反,补码 由反码加一。
整数在内存中存储的均为补码,运算时也是补码进行运算,输出是转换成原码。
3.大小端存储
大端存储(高低低高):低字节内容放到高地址处,高字节内容放到低地址处。
小端存储(高高低低):高字节内容放到高地址处,低字节内容放到低地址处。
4.整型提升
无符号数--高位补零
有符号数--高位补符号位
%u-输出无符号整形
%d-输出有符号整形
1.
1.
// 输出什么?
#include <stdio.h>
int main ()
{
    char a = - 1 ;
    signed char b =- 1 ;
    unsigned char c =- 1 ;
    printf ( "a=%d,b=%d,c=%d" , a , b , c );
    return 0 ;
}
//答案a=-1,b=-1,c=255;
#include <stdio.h>
int main ()
{
    char a = - 1 ;
//1000 0000 0000 0000 0000 0000 0000 0001--原码
//1111  1111  1111 1111  1111  1111  1111  1110--反码
//1111  1111 1111  1111  1111  1111 1111   1111--补码
//由于a是char类型,所以a在内存中--1111 1111
    signed char b =- 1 ;
//1000 0000 0000 0000 0000 0000 0000 0001--原码
//1111  1111  1111 1111  1111  1111  1111  1110--反码
//1111  1111 1111  1111  1111  1111 1111   1111--补码
//由于b是char类型,所以b在内存中--1111 1111
    unsigned char c =- 1 ;
//1000 0000 0000 0000 0000 0000 0000 0001--原码
//1111  1111  1111 1111  1111  1111  1111  1110--反码
//1111  1111 1111  1111  1111  1111 1111   1111--补码
//由于c是char类型,所以c在内存中--1111 1111
    printf ( "a=%d,b=%d,c=%d" , a , b , c );
//整形提升 a--有符号,补符号位,a的补码1111 1111 1111 1111 1111 1111  1111 1111
                                                      a的原码1000 0000 0000 0000 0000 0000 0000 0001
//               b--有符号,补符号位,b的补码1111 1111 1111 1111 1111 1111  1111 1111
//                                                    b的原码1000 0000 0000 0000 0000 0000 0000 0001
//               c--无符号位,补零,c的补码0000 0000 0000 0000 0000 0000 1111 1111
//                                          以%d的形式打印,打印的是有符号的,c现在的符号位是0,是正数,                                                 所以原码,反码,补码一样
                                                 
    return 0 ;
}
2.
#include <stdio.h>
int main ()
{
    char a = - 128 ;
    printf ( "%u\n" , a );
    return 0 ;
}
//答案是4294967168
#include <stdio.h>
int main ()
{
    char a = - 128 ;
//a的补码1111 1111 1111 1111 1111 1111 1000 0000
//a--1000 0000
//a是有符号的,所以整形提升补符号位
//1111 1111 1111 1111 1111 1111 1000 0000
//1000 0000 0000 0000 0000 0000 1000 0000
//因为%u所以第一位为数值位。
    printf ( "%u\n" , a );
    return 0 ;
}
3.
#include <stdio.h>
int main ()
{
    char a = 128 ;
    printf ( "%u\n" , a );
    return 0 ;
}
//答案是4294967168
#include <stdio.h>
int main ()
{
    char a = 128 ;
//a的补码0111 1111 1111 1111 1111 1111 1000 0000
//a-- 1000 0000
//a是有符号的,所以整形提升补符号位,现在的符号位是1(标红的那个)
//1111 1111 1111 1111 1111 1111 1000 0000
//1000 0000 0000 0000 0000 0000 1000 0000
//因为%u所以第一位为数值位。
    printf ( "%u\n" , a );
    return 0 ;
}
4.
#include <stdio.h>
int main ()
{
   int i = - 20 ;
//1000 0000 0000 0000 0000 0000 0001 0100
//1111 1111 1111 1111 1111 1111 1110 1011

//1111 1111 1111 1111 1111 1111 1110 1100

   unsigned   int   j = 10 ;
//0000 0000 0000 0000 0000 0000 0000 1010
   printf ( "%d\n" , i + j );
   //按照补码的形式进行运算,最后格式化成为有符号整数
    return 0 ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值