计算机中数据的存储(C语言)

简介: 计算机中数据的存储(C语言)

一、原码、反码、补码

根据本人自己的理解:

  1. 原码就是一个数字的二进制。
  2. 反码是原码的符号位不变,其余位置取反(0→1,1→0)。(符号位就是最高位,0代表正,1代表负)
  3. 补码就是反码加1。(计算机中存的是补码而不是原码)
    以上建立在有符号位的基础上,因为无符号位的话,原码、反码。补码是相同的。
    在C语言中默认都是有符号位的。如果无符号位要加上unsighd。如:unsigned int a=10;
    例子:比如在C语言中一个int型是4个字节。(一个字节8个比特位)
    int a=10;这个:
原码为:00000000000000000000000000001010
反码为:01111111111111111111111111110101
补码为:01111111111111111111111111110110

了解原码,反码,补码之后就是做题加深理解。

二、练习题

这些题都是出自公司笔试题所以不要想着敲出来,否则没什么意义。

第一题

//输出什么?
#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;
}

第二题

//输出什么?
#include <stdio.h>
int main() {
  char a = -128;
  printf("%u\n", a);
}
//%d是打印十进制有符号的数字
//%u是打印十进制无符号的数字

第三题

//输出什么?
#include <stdio.h>
int main() {
  char a = 128;
  printf("%u\n", a);
}

三、题目解析

第一题

分析可知a和b都是有符号的,结果应该是一样的。

-1的原码,反码,补码如下:

原码:10000000000000000000000000000001
反码:11111111111111111111111111111110
补码:11111111111111111111111111111111

因为是char类型的只能存8个比特位,所以要截断后8位是(截断的是补码):

11111111

但是题目要求打印有符号的十进制并且是整型,所以要整型提升为:

11111111111111111111111111111111

以上是补码转换为反码就是减1为:

11111111111111111111111111111110

反码转化为原码就是符号位不变,其余取反为:

10000000000000000000000000000001

所以a和b的结果都是-1;

c截断的补码是

11111111

但是由于c是无符号位所以整型提升后是:

00000000000000000000000011111111

因为无符号位的原码,反码,补码相同。最终结果就是255。

综上结果是a=-1,b=-1,c=255

第二题

-128:

原码是:10000000000000000000000010000000
反码是:11111111111111111111111101111111
补码是:11111111111111111111111110000000

char类型要发生截断为:

10000000

但是要求打印十进制无符号位要进行整型提升为:

11111111111111111111111110000000

因为%u是无符号位所以原码,反码,补码相同。

结果是4294967168

第三题

128,char类型是8个比特位最大值是:

01111111

这个是char类型可以存的最大正数为127,如果加1变为

10000000   C语言中规定这个数的十进制是-128;

所以结果和第二题结果一样为4294967168

四、整型提升

整型提升是C程序设计语言中的一项规定:在表达式计算时,各种整形首先要提升为int类型,如果int类型不足以表示则要提升为unsigned int类型;然后执行表达式的运算。

提升规则:如果有符号按照符号补全如(10001111整型提升为11111111111111111111111110001111)


相关文章
|
16天前
|
存储 程序员 编译器
C 语言中的数据类型转换:连接不同数据世界的桥梁
C语言中的数据类型转换是程序设计中不可或缺的一部分,它如同连接不同数据世界的桥梁,使得不同类型的变量之间能够互相传递和转换,确保了程序的灵活性与兼容性。通过强制类型转换或自动类型转换,C语言允许开发者在保证数据完整性的前提下,实现复杂的数据处理逻辑。
|
17天前
|
存储 数据管理 C语言
C 语言中的文件操作:数据持久化的关键桥梁
C语言中的文件操作是实现数据持久化的重要手段,通过 fopen、fclose、fread、fwrite 等函数,可以实现对文件的创建、读写和关闭,构建程序与外部数据存储之间的桥梁。
|
20天前
|
存储 数据建模 程序员
C 语言结构体 —— 数据封装的利器
C语言结构体是一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个整体。它支持数据封装,便于管理和传递复杂数据,是程序设计中的重要工具。
|
26天前
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
54 11
|
2月前
|
存储 C语言 C++
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
|
2月前
|
存储 C语言
深入C语言内存:数据在内存中的存储
深入C语言内存:数据在内存中的存储
|
2月前
|
C语言
回溯入门题,数据所有排列方式(c语言)
回溯入门题,数据所有排列方式(c语言)
|
存储 程序员 C语言
程序员之路:C语言中存储类别
程序员之路:C语言中存储类别
136 0
|
15天前
|
存储 C语言 开发者
【C语言】字符串操作函数详解
这些字符串操作函数在C语言中提供了强大的功能,帮助开发者有效地处理字符串数据。通过对每个函数的详细讲解、示例代码和表格说明,可以更好地理解如何使用这些函数进行各种字符串操作。如果在实际编程中遇到特定的字符串处理需求,可以参考这些函数和示例,灵活运用。
36 10
|
15天前
|
存储 程序员 C语言
【C语言】文件操作函数详解
C语言提供了一组标准库函数来处理文件操作,这些函数定义在 `<stdio.h>` 头文件中。文件操作包括文件的打开、读写、关闭以及文件属性的查询等。以下是常用文件操作函数的详细讲解,包括函数原型、参数说明、返回值说明、示例代码和表格汇总。
37 9