char的越界赋值即其原理剖析
思考:
int ch = ‘A’;
int ch1 = 65;
int ch2 = 321;
printf("%c %c %c\n", ch, ch1, ch2);的输出结果是什么?
char ch = 0;
char ch1 = -128;
char ch2 = 128;
char ch3 = 256;
printf("%d %d %d %d\n", ch, ch1, ch2, ch3);的输出结果又是什么?
我们都知道,char字符类型根据ASCII码表中的ascii值显示字符,并且char类型的范围为-128~127,但是像char ch = 256;这种赋值仍然可以赋值成功,通过上面的思考我已经有了一定的猜想。
输出结果:A A A 0 -128 -128 0
猜想:
char类型的范围为-128~127
char ch1 = 128;输出:-128
分析:127为char的右极限值,-128位char的左极限值char ch3 = 256;输出:0
分析:256为char的容量
总结:当输入的值大于char的一边极限值时,会从另一边开始以剩余的差值计算。

测试:
#include <stdio.h>
int main()
{
char ch;
for (int i = 0; i <= 512; i++)
{
ch = i;
printf("%d -> %d\n", i, ch);
}
return 0;
}
输出:
0 -> 0
1 -> 1
2 -> 2
省略部分输出结果 ……
127 -> 127 //char -128~127
128 -> -128
129 -> -127
省略部分输出结果 ……
254 -> -2
255 -> -1
256 -> 0
257 -> 1
258 -> 2
省略部分输出结果 ……
510 -> -2
511 -> -1
512 -> 0
很好,测试结果与我们猜想的一致,那么问题又来了,究竟是不是所有的类型赋值方法都是这样呢,还是只有char是个特例呢?
unsigned char测试
//unsigned char 0 ~ 255
unsigned char ch = 0; //0
unsigned char ch1 = -1; //255 = 256 -1
unsigned char ch2 = 256; //0 = 0+256
unsigned char ch3 = 250; //250 = 0+255
unsigned char ch4 = 300; //44 = 256+44
unsigned char ch5 = 400; //144 = 256+144
unsigned char ch6 = -200; //56 = 256 - 200
unsigned char类型容量为256,则256的倍数全为0(循环一圈回到0位置),可以根据这一特点计算。
例如:
- 正数n(>255)
- 256的倍数
0 - n == k×256+x
x
- 256的倍数
- 负数n(>255)
- 256的倍数
0 - n == -k×256+x
x
- 256的倍数
对于char类型,也可以根据取值范围整理出相应的计算公式。大家可对照测试结果自行整理。
此外,int unsigned in short ……等中应该也成立,这里就不再做测试。
另附上
int 越界处理:可以通过位运算的方式求得各类型的取值范围。
'\ddd’转义字符与八进制转换:char类型的其他赋值方式
char的越界赋值即其原理剖析的更多相关文章
- iPhone/Mac Objective-C内存管理教程和原理剖析
http://www.cocoachina.com/bbs/read.php?tid-15963.html 版权声明 此文版权归作者Vince Yuan (vince.yuan#gmail.com)所 ...
- 【Xamarin 跨平台机制原理剖析】
原文:[Xamarin 跨平台机制原理剖析] [看了请推荐,推荐满100后,将发补丁地址] Xamarin项目从喊口号到现在,好几个年头了,在内地没有火起来,原因无非有三,1.授权费贵 2.贵 3.原 ...
- 【Xamain 跨平台机制原理剖析】
原文:[Xamain 跨平台机制原理剖析] [看了请推荐,推荐满100后,将发补丁地址] Xamarin项目从喊口号到现在,好几个年头了,在内地没有火起来,原因无非有三,1.授权费贵 2.贵 3.原生 ...
- ThreadLocal及InheritableThreadLocal的原理剖析
我们知道,线程的不安全问题,主要是由于多线程并发读取一个变量而引起的,那么有没有一种办法可以让一个变量是线程独有的呢,这样不就可以解决线程安全问题了么.其实JDK已经为我们提供了ThreadLocal ...
- 开源 serverless 产品原理剖析 - Kubeless
背景 Serverless 架构的出现让开发者不用过多地考虑传统的服务器采购.硬件运维.网络拓扑.资源扩容等问题,可以将更多的精力放在业务的拓展和创新上. 随着 serverless 概念的深入人心, ...
- 0000 - Spring 中常用注解原理剖析
1.概述 Spring 框架核心组件之一是 IOC,IOC 则管理 Bean 的创建和 Bean 之间的依赖注入,对于 Bean 的创建可以通过在 XML 里面使用 <bean/> 标签来 ...
- Spring 中常用注解原理剖析
前言 Spring 框架核心组件之一是 IOC,IOC 则管理 Bean 的创建和 Bean 之间的依赖注入,对于 Bean 的创建可以通过在 XML 里面使用 <bean/> 标签来配置 ...
- 原理剖析-Netty之服务端启动工作原理分析(下)
一.大致介绍 1.由于篇幅过长难以发布,所以本章节接着上一节来的,上一章节为[原理剖析(第 010 篇)Netty之服务端启动工作原理分析(上)]: 2.那么本章节就继续分析Netty的服务端启动,分 ...
- threading.local()使用与原理剖析
threading.local()使用与原理剖析 前言 还是第一次摘出某个方法来专门写一篇随笔,哈哈哈. 为什么要写这个方法呢?因为它确实太重要了,包括后期的Flask框架源码中都有它的影子. 那么我 ...
随机推荐
- 快速构建 React 开发环境
使用 create-react-app 快速构建 React 开发环境 create-react-app 是来自于 Facebook,通过该命令我们无需配置就能快速构建 React 开发环境. cre ...
- Go代码规范梳理
Go代码规范(Code Review) 总结几个开发过程中经常会犯的代码规范错误 参考链接:https://learnku.com/go/wikis/48375 注释语句 // Request 表示运 ...
- WPF启动屏幕SplashScreen
SplashScreen类为WPF应用程序提供启动屏幕. 方法一:设置图片属性 1. 添加启动图片到项目中 2. 设置图片属性的Build Action为SplashScreen 方法二:编写代码 1 ...
- MM32F0140 GPIO驱动LED灯(MM32F0140 GPIO)
目录: 1.MM32F0140简介 2.MM32F0140系统时钟配置 3.MM32F0140的GPIO外设配置及其初始化 4.使用官网的Systick定时器做延时 5.MM32F0140 GPIO驱 ...
- petite-vue源码剖析-事件绑定`v-on`的工作原理
在书写petite-vue和Vue最舒服的莫过于通过@click绑定事件,而且在移除元素时框架会帮我们自动解除绑定.省去了过去通过jQuery的累赘.而事件绑定在petite-vue中就是一个指令(d ...
- laravel 框架简易增删改查
参看网址:http://www.yan.com/mou/add 图书增加HTML页面 //图书增加路由 Route::get('mou/add','MouController@store'); //控 ...
- mybatis的几种like查询
oracle数据库: Java代码 SELECT * FROM user WHERE name like CONCAT('%',#{name},'%') 或 Java代码 SELECT * FROM ...
- 流量回放专题-jvm-sanbox-repeater
流量回放介绍 一.前言 你是否和我一样遇到过以下的问题? 1)服务重构,一堆接口需要回归,让人头疼 2)每次迭代,都要花很多精力来进行回归测试 3)线上bug,线下复现不了 4)接口自动化用例写辛苦, ...
- 4月2日 python学习总结
昨天内容回顾: 1.迭代器 可迭代对象: 只要内置有__iter__方法的都是可迭代的对象 既有__iter__,又有__next__方法 调用__iter__方法==>得到内置的迭代器对象 调 ...
- java线程池之newFixedThreadPool定长线程池
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待. 线程池的作用: 线程池作用就是限制系统中执行线程的数量. 根 据系统的环境情况,可以 ...