思考:

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

  1. char ch1 = 128;输出:-128

     分析:127char的右极限值,-128char的左极限值
  2. char ch3 = 256;输出:0

     分析:256char的容量

总结:当输入的值大于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
  • 负数n(>255)
    • 256的倍数     0
    • n == -k×256+x x

对于char类型,也可以根据取值范围整理出相应的计算公式。大家可对照测试结果自行整理。


此外,int unsigned in short ……等中应该也成立,这里就不再做测试。

另附上

  int 越界处理:可以通过位运算的方式求得各类型的取值范围。

  '\ddd’转义字符与八进制转换:char类型的其他赋值方式

char的越界赋值即其原理剖析的更多相关文章

  1. iPhone/Mac Objective-C内存管理教程和原理剖析

    http://www.cocoachina.com/bbs/read.php?tid-15963.html 版权声明 此文版权归作者Vince Yuan (vince.yuan#gmail.com)所 ...

  2. 【Xamarin 跨平台机制原理剖析】

    原文:[Xamarin 跨平台机制原理剖析] [看了请推荐,推荐满100后,将发补丁地址] Xamarin项目从喊口号到现在,好几个年头了,在内地没有火起来,原因无非有三,1.授权费贵 2.贵 3.原 ...

  3. 【Xamain 跨平台机制原理剖析】

    原文:[Xamain 跨平台机制原理剖析] [看了请推荐,推荐满100后,将发补丁地址] Xamarin项目从喊口号到现在,好几个年头了,在内地没有火起来,原因无非有三,1.授权费贵 2.贵 3.原生 ...

  4. ThreadLocal及InheritableThreadLocal的原理剖析

    我们知道,线程的不安全问题,主要是由于多线程并发读取一个变量而引起的,那么有没有一种办法可以让一个变量是线程独有的呢,这样不就可以解决线程安全问题了么.其实JDK已经为我们提供了ThreadLocal ...

  5. 开源 serverless 产品原理剖析 - Kubeless

    背景 Serverless 架构的出现让开发者不用过多地考虑传统的服务器采购.硬件运维.网络拓扑.资源扩容等问题,可以将更多的精力放在业务的拓展和创新上. 随着 serverless 概念的深入人心, ...

  6. 0000 - Spring 中常用注解原理剖析

    1.概述 Spring 框架核心组件之一是 IOC,IOC 则管理 Bean 的创建和 Bean 之间的依赖注入,对于 Bean 的创建可以通过在 XML 里面使用 <bean/> 标签来 ...

  7. Spring 中常用注解原理剖析

    前言 Spring 框架核心组件之一是 IOC,IOC 则管理 Bean 的创建和 Bean 之间的依赖注入,对于 Bean 的创建可以通过在 XML 里面使用 <bean/> 标签来配置 ...

  8. 原理剖析-Netty之服务端启动工作原理分析(下)

    一.大致介绍 1.由于篇幅过长难以发布,所以本章节接着上一节来的,上一章节为[原理剖析(第 010 篇)Netty之服务端启动工作原理分析(上)]: 2.那么本章节就继续分析Netty的服务端启动,分 ...

  9. threading.local()使用与原理剖析

    threading.local()使用与原理剖析 前言 还是第一次摘出某个方法来专门写一篇随笔,哈哈哈. 为什么要写这个方法呢?因为它确实太重要了,包括后期的Flask框架源码中都有它的影子. 那么我 ...

随机推荐

  1. Docker学习笔记(详细)

    目录 01 介绍 02 Docker安装 03 Docker常用命令 04 Docker镜像 05 Docker容器数据卷 06 Dockerfile解析 Dockerfile构建过程解析 Docke ...

  2. Seastar 教程(二)

    协程 注意:协程需要 C++20 和支持的编译器.已知 Clang 10 及更高版本可以工作. 使用 Seastar 编写高效异步代码的最简单方法是使用协程.协程没有传统continuation(如下 ...

  3. SpringBoot接入轻量级分布式日志框架(GrayLog)

    我是3y,一年CRUD经验用十年的markdown程序员‍常年被誉为优质八股文选手 前两天我不是发了一篇数据链路追踪的文章嘛,在末尾也遗留了TODO:运行应用的服务器一般是集群,日志数据会记录到不同的 ...

  4. think php 验证器及验证场景的使用

    1:在需要验证的模块名下建一个validate文件夹 ,文件夹下建议个验证的 名称   Goods.php 2:打开Goods.php <?php namespace app\api\valid ...

  5. Semantic Text Similarity

    stop word是指像the,is ,are等等方向的词 stemming意思就是将形式化为一样的形式,比如lists,listed,list都可以化为list形式.

  6. 35 异常机制 异常处理机制 异常处理五个关键字 try、catch、finally、throw、thorws 代码

    异常处理机制 概念 抛出异常 捕获异常 异常处理五个关键字 try.catch.finally.throw.thorws 代码 // main { int a = 1; int b = 0; // 假 ...

  7. SQL语句的使用,SELECT - 从数据库表中获取数据 UPDATE - 更新数据库表中的数据 DELETE - 从数据库表中删除数据 INSERT INTO - 向数据库表中插入数据

    SQL DML 和 DDL 可以把 SQL 分为两个部分:数据操作语言 (DML) 和 数据定义语言 (DDL). SQL (结构化查询语言)是用于执行查询的语法. 但是 SQL 语言也包含用于更新. ...

  8. 在基于ABP框架的前端项目Vue&Element项目中采用日期格式处理,对比Moment.js和day.js的处理

    Day.js 是一个轻量的处理时间和日期的 JavaScript 库,和 Moment.js 的 API 设计保持完全一样. 如果您曾经用过 Moment.js, 那么您已经知道如何使用 Day.js ...

  9. LGP5386题解

    写在前面的废话 自己写了两天,调了半天,然后jzp来帮忙调了一个小时,终于过了 过的时候耳机里放着桐姥爷的bgm,就差哭出来了 题解 首先这题没有部分分差评( 值域不变 我们可以注意到,如果一个区间全 ...

  10. e值计算来了

    e值该如何计算呢? 若关于ex幂级数展开 ex=1+x+x2/2!+x3/3!+•••+xn/n! 取x=1,有e=1+1/2+1/6+••• 接下来就是十分简单的编程 这里选用了python语言(当 ...