C语言整型在内存中的存储(练习)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: C语言整型在内存中的存储(练习)

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);  // a=-1,b=-1,c=255
  return 0;
}

//解析:


-1占4个字节,而char类型大小是1个字节,所以这时要发生截断

10000000000000000000000000000001  ----原码

11111111111111111111111111111110  ----反码

11111111111111111111111111111111  ----补码

截断后

a --->  11111111

同理

b --->  11111111

c --->  11111111

在内存中存储的是补码,各占8字节,但是打印的是用%d的形式打印的,所以要发生整型提升

char  <---->  signed char

a就是有符号的char,所以a的最高位就是符号位1,整型提升补1

a --->  11111111111111111111111111111111   提升后的补码,但打印的是原码。

        11111111111111111111111111111110   反码

        10000000000000000000000000000001   原码

a=-1,同理b=-1

c --->  11111111 是无符号的char类型,所以最高位1就不是符号位,整型提升补0

c --->  00000000000000000000000011111111   整型提升后补码,是正数,所以原码反码补码相同

将c转成10进制就是255  c=255


2.

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

// 解析:


-128的二进制表示为:

10000000000000000000000010000000 --->原码

11111111111111111111111101111111 --->反码

11111111111111111111111110000000 --->补码

因为char类型,发生截断,最多存放1个字节,即:

a--->  10000000

因为打印%u的类型,无符号整型,发生整型提升,所以最高位1就是符号位,补1

a--->  11111111111111111111111110000000

正是因为是无符号打印,所以判定11111111111111111111111110000000就是个正数,原反补均相同

转换成10进制打印下就是4294967168


3.

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

//解析:

a的补码

01111111111111111111111110000000 --->a的补码

截断

10000000

整型提升

11111111111111111111111110000000

同上

4.

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

// 解析:


i=-20:

10000000000000000000000000010100   原码

11111111111111111111111111101011   反码

11111111111111111111111111101100   补码

j=10:

00000000000000000000000000001010   原码-反码-补码

i+j:

11111111111111111111111111110110   补码

11111111111111111111111111110101   反码

10000000000000000000000000001010   原码

转换成10进制:

i + j = -10


5.

#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;
}

// 解析


当i--到-1时,-1的二进制表示为:

10000000000000000000000000000001  原码

11111111111111111111111111111110  反码

11111111111111111111111111111111  补码

因为%u打印,所以11111111111111111111111111111111全是有效位,即位正数,输出的原码 等于反码

转成10进制,就是一个很大的数字,以此类推陷入死循环。


6.

#include<stdio.h>
int main()
{
  char a[1000];
  int i;
  for (i = 0; i < 1000; i++)
  {
    a[i] = -1 - i;
  }
  printf("%d", strlen(a));  // 255
  return 0;
}

理解这道题需要清楚一个char类型到底能放什么数值

image.png类似的,short也有类似的性质:image.png 

同理int等等

7.

#include<stdio.h>
unsigned char i = 0;
int main()
{
  for (i = 1; i <= 255; i++)
  {
    printf("hello world\n");  //死循环打印hello world
  }
  return 0;
}

// 解析


这道题目的做法跟上一道题目类似,都涉及到了char类型到底能放什么数值,由上题可知,unsigned char类型取值范围是在0~255,当i++到255时,其二进制表示1字节为11111111,当i在加1的时候,11111111+1得到100000000,取8bit,再转换成10进制就是0,以此类推1,2,3,4,等等依次循环,所以会死循环打印hello world  


相关文章
|
19天前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
30 3
|
4天前
|
C语言
【c语言】动态内存管理
本文介绍了C语言中的动态内存管理,包括其必要性及相关的四个函数:`malloc`、``calloc``、`realloc`和`free`。`malloc`用于申请内存,`calloc`申请并初始化内存,`realloc`调整内存大小,`free`释放内存。文章还列举了常见的动态内存管理错误,如空指针解引用、越界访问、错误释放等,并提供了示例代码帮助理解。
12 3
|
19天前
|
编译器 程序员 C语言
深入C语言:动态内存管理魔法
深入C语言:动态内存管理魔法
|
6天前
|
存储 C语言
【c语言】字符串函数和内存函数
本文介绍了C语言中常用的字符串函数和内存函数,包括`strlen`、`strcpy`、`strcat`、`strcmp`、`strstr`、`strncpy`、`strncat`、`strncmp`、`strtok`、`memcpy`、`memmove`和`memset`等函数的使用方法及模拟实现。文章详细讲解了每个函数的功能、参数、返回值,并提供了具体的代码示例,帮助读者更好地理解和掌握这些函数的应用。
9 0
|
15天前
|
C语言
保姆级教学 - C语言 之 动态内存管理
保姆级教学 - C语言 之 动态内存管理
13 0
|
19天前
|
存储 C语言
深入C语言内存:数据在内存中的存储
深入C语言内存:数据在内存中的存储
|
19天前
|
C语言 C++
c语言回顾-内存操作函数
c语言回顾-内存操作函数
38 0
|
21天前
|
存储 C语言 C++
来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp
本文详细介绍了C语言中的四个内存操作函数:memcpy用于无重叠复制,memmove处理重叠内存,memset用于填充特定值,memcmp用于内存区域比较。通过实例展示了它们的用法和注意事项。
54 0
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
297 0
|
5天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
13 1