C语言数据类型详解及相关题——各种奇奇怪怪的偏难怪

2024-03-07 22:44

本文主要是介绍C语言数据类型详解及相关题——各种奇奇怪怪的偏难怪,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、C语言基本数据类型
    • 溢出
  • 二、存储原理
    • 符号位
    • 原码
    • 反码
    • 补码
    • 补码操作的例子
  • 三、赋值中的类型转换
  • 常见返回类型——巨坑
  • 总结


一、C语言基本数据类型

在这里插入图片描述

溢出

因为数据范围(即存储单元的位的数量)的限制,可以表达的位数是有限的。
溢出分为正溢出和负溢出,原理都是相近的。
溢出会发生截断,将从右往左数超过数据范围的位全部丢弃。
就会出现最大的正数+1就变成了最大的负数这种情况,或者最小的负数-1变成了最大的正数。
例:

//程序结果为?
int main()
{	unsigned char a, b, c, d;a = 30;b = a++;c = ++a;d = 10*(a++);printf("%d %d %d\n", b, c, d);
}

正确答案为:30 32 64
主要说下D,正常算d=320超uchar了
320表示:1 0100 0000
发生截断:0100 0000 为64

二、存储原理

符号位

用二进制 0 代表正数,二进制 1 代表负数。用第一个一个二进制位单独代表符号

原码

符号位加上整数的绝对值的组合。

反码

是每个二进制位变为相反的值。
正整数的反码是原码本身。
负整数是要处理的,其中符号位的 1 不参加反码处理,符号位以外的各个位都要按位取反。

补码

如果是正整数,那么补码还是原码本身。可如果是负整数则在上一个(反码)的基础上再补加一个二进制的 1
最终计算机存储起来的是补码后的结果。

补码操作的例子

补码存储这点很重要!做题时候很多时候就会忘。

比如:-1的原码理论上应该是:1000 0001,但是在计算机中应该是1111 1111(补码存储)
还有那个~x=-x-1公式中,这个-x指的也是补码。
例如-1的~x是0000 0000,而-x=0000 0001,则-1即为答案。

例:

//以下代码的执行结果是().
int main(){int i=-2147483648;return printf("%d,%d,%d,%d",~i,-i,1-i,-1-i);
}

正确答案为:2147483647,-2147483648,-2147483647,2147483647
解释:
-2147483647补码为:1000 0000 0000 0000 0000 0000 0000 0001
-1     补码为:1111 1111 1111 1111 1111 1111 1111 1111
-2147483648补码为:1000 0000 0000 0000 0000 0000 0000 0000 (溢出)
则:
~i就是 0111 1111 1111 1111 1111 1111 1111 1111 即为:2147483647

-i为-(-2147483648)=(2147483647 + 1)
2147483647补码为:0111 1111 1111 1111 1111 1111 1111 1111
1     补码为:0000 0000 0000 0000 0000 0000 0000 0001
1000 0000 0000 0000 0000 0000 0000 0000 又是-2147483648

1-i为 (-i)+ 1 即为:1000000 00000000 00000000 00000001 求一下源码发现是-2147483647

-1-i为:1000000 00000000 00000000 00000000 + 11111111 11111111 11111111 11111111
得:01111111 11111111 11111111 11111111
为2147483647

再例:


正确答案为:

三、赋值中的类型转换

如果赋值运算符两侧的类型不一致,但都是数值型或字符型时,在赋值时自动进行类型转换。

  1. 将浮点型数据(包括单、双精度)赋给整型变量时,舍弃其小数部分。
  2. 将整型数据赋给浮点型变量时,数值不变,但以指数形式存储到变量中。
  3. 将一个double型数据赋给flout变量时,要注意数值范围不能溢出。
  4. 字符型数据赋给整型变量,将字符的ASCII码赋给整型变量。
  5. 将一个int, short或long型数据赋给一个char型变量,只将其低8位原封不动地送到char型变量(发生截断)。
  6. 有符号数与无符号数相加,有符号就会变成无符号数

例:

//求count的值
int func()
{int count = 0;unsigned int a = 1;int b = -5;while (b++ <= 5){if (a + b > 5){count++;}}return count;
}

正确答案:5
考点在于有符号数与无符号数相加,有符号就会变成无符号数
负数转成无符号数,结果等于这个负数加上无符号数的模。
-4为11111111 11111111 11111111 11111100
无符号是4294967295(其实就是有符号上限*2+1),肯定大于5
直到-1,为11111111 11111111 11111111 11111111 ,此时count=3
此时+1溢出,为0000000 00000000 00000000 00000000,小于5了
再直到5和6,这两次count++,为5

再例:


正确答案为:


常见返回类型——巨坑

有些题不明显给,通过函数和一些关键字隐含,很容易掉坑
比如:sizeof返回类型:size_t。也就是unsigned int。
getchar返回类型:int。
函数的隐含储存类型是extern,函数的形参或变量的储存类型为auto
除法运算符 “/” 两边参加运算对象都是整数,运算结果要取整
% 整除取余数运算,二个运算数必须是整型。
函数值类型的定义可以缺省,此时函数值的隐含类型是int

…待补充

总结

这就是我大概的理解,有点像我平时摞书,最近常看的书放到最顶上,不长看的书就慢慢放到底下了。

这篇关于C语言数据类型详解及相关题——各种奇奇怪怪的偏难怪的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/785082

相关文章

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

Python列表去重的4种核心方法与实战指南详解

《Python列表去重的4种核心方法与实战指南详解》在Python开发中,处理列表数据时经常需要去除重复元素,本文将详细介绍4种最实用的列表去重方法,有需要的小伙伴可以根据自己的需要进行选择... 目录方法1:集合(set)去重法(最快速)方法2:顺序遍历法(保持顺序)方法3:副本删除法(原地修改)方法4:

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

前端CSS Grid 布局示例详解

《前端CSSGrid布局示例详解》CSSGrid是一种二维布局系统,可以同时控制行和列,相比Flex(一维布局),更适合用在整体页面布局或复杂模块结构中,:本文主要介绍前端CSSGri... 目录css Grid 布局详解(通俗易懂版)一、概述二、基础概念三、创建 Grid 容器四、定义网格行和列五、设置行

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

SQL表间关联查询实例详解

《SQL表间关联查询实例详解》本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(leftjoin)、右连接(rightjoin)、全连接(fulljoin)、内连接(innerjoin)、... 目录简介样例准备左外连接右外连接全外连接内连接交叉连接自然连接简介本文主要讲解SQL语句中常用的表

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

Python中局部变量和全局变量举例详解

《Python中局部变量和全局变量举例详解》:本文主要介绍如何通过一个简单的Python代码示例来解释命名空间和作用域的概念,它详细说明了内置名称、全局名称、局部名称以及它们之间的查找顺序,文中通... 目录引入例子拆解源码运行结果如下图代码解析 python3命名空间和作用域命名空间命名空间查找顺序命名空