对char类型的理解以及对补码的理解分析
今天遇到这样一个小程序,觉得当中有些问题很容易让人忽略的!
这个程序代码如下:

程序的结果为:

我想很多像我一样的小白可能才开始是想不明白为什么最后的结果是255吧!首先,我们得知道 strlen()是计算字符串长度的函数,但为什么最后得到的字符串长度是255呢?定义的数组a中不是有1000个元素,并且for循环也是执行999次吗?
对于char来说,我们得知道其隐含的结束标记是\0,当编译器识别一个char类型的变量时,读取到\0,则标志着结束;对于这个程序,我们还得注意char的取值围:-128~127
所以当i = 128时 a[128] = -1 -128 = -129 ,那么到这里就出现问题了,a 中元素的最小值只能为-128,怎么办?在这里得知道,在计算机中,存储数据都是以补码的方式存储的,-128在计算机中的编码为1000 0000 ,-1的补码为1111 1111 ,所以-129 的补码为 1 0111 1111 ,但是char中的二进制位只有八位,所以把最高位丢掉,剩下的其余为作为补码,也就是0111 1111(0x7f)通过循环,依次减一 0x7d,0x7c,0x7b,0x7a,0x79,0x78,0x77,0x76,0x75,0x74,0x73,0x72,0x71,0x70......0x00,所以当编码为0x00时,a[255]= 0;所以当a[255]= 0时,作为字符串结束的标志,在a[0]~a[254]的元素都不为0,所以最终程序执行的结果就是字符串a的长度为255.
对char类型的理解以及对补码的理解分析的更多相关文章
- 加深关于Java中char类型的理解
1.JAVA中,char占2字节,16位.可在存放汉字 2.char赋值 char a='a'; //任意单个字符,加单引号. char a='中';//任意单个中文字,加单引号. char a=1 ...
- 带符号的char类型取值范围为什么是-128——127
以前经常看到带符号的char类型取值范围是-128——127,今天突然想为什么不是-127——127,-128是怎么来的? 127好理解,char类型是8位,最高位是符号位,0正1负,所以011111 ...
- char类型与Unicode的编码
Java的char型是非常独特的,占用两个字节,因为Java中char型采用了Unicode编码. 要理解这个问题,我们必须要理解什么是Unicode. 世界上存在着多种编码方式,同一个二进制数字可以 ...
- 浅析为什么char类型的范围是 —128~+127
转载于daiyutage 在C语言中, signed char 类型的范围为-128~127,每本教科书上也这么写,但是没有哪一本书上(包括老师)也不会给你为什么是-128~127,这个问题貌似看起来 ...
- (C语言)char类型与int类型相加
#include <stdio.h> int main(void) { ; ; int c = a + b; a += b; printf("c=%d",c); //p ...
- MySQL varchar和char类型
varchar和char是两种最主要的字符串类型.不幸的是,很难精确地解释这些值是怎么储存在磁盘和内存中的,因为这根存储引擎的具体实现有关.下面的描述假设使用的存储引擎是InnoDB或者MyISAM. ...
- C++中char类型的溢出问题
C++中什么经常会运用到char类型,也会将char类型作为循环语句的循环条件,但往往这里最容易出现错误,容易出现溢出,进入死循环.这里我们就来简单介绍下为什么会出现这种情况. 首先,了解下char类 ...
- 34 char类型转换为int类型
#include<iostream> #include<cstdlib > using namespace std; int main() { char a=101; int ...
- unsigned/signed int/char类型表示的数值范围
一个32位的signed int类型整数表示的范围:-2^31~2^31-1 一个32位的unsigned int类型整数表示的范围: 0~2^32-1 一个8位的signed char类型整数表示的 ...
随机推荐
- Sql Server 删除所有表
如果由于外键约束删除table失败,则先删除所有约束: --/第1步**********删除所有表的外键约束*************************/ DECLARE c1 cursor f ...
- 并发编程 19—— 显式的Conditon 对象
Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...
- asp.net页面跳转sessionid会变
今天发现在一个Asp.net站点中, 同一次登录, 不停刷新页面或者页面跳转, 此时后台Session的SessionID总是变化的. 创建一个页面,添加一个button,后台代码非常简单,如下 ...
- 使用Jsoup 抓取页面的数据
需要使用的是jsoup-1.7.3.jar包 如果需要看文档我下载请借一步到官网:http://jsoup.org/ 这里贴一下我用到的 Java工程的测试代码 package com.javen ...
- linux下用phpize给PHP动态添加扩展
使用php的常见问题是编译php时忘记添加某扩展,后来想添加扩展,但是因为安装php后又装了一些东西如PEAR等,不想删除目录重装,这里就需要用到phpize了. 如我想增加bcmath扩展的支持,这 ...
- sql like in 语句获取以逗号分割的字段内的数据
From:http://www.cnblogs.com/goody9807/archive/2011/07/27/2118107.html sql中的某个字段用“,”分隔数据,需要获取数据的时候直接把 ...
- bzero函数
函数原型:void bzero(void *s,int n) 作用:bzero函数的作用是将s指针指向的地址的前n个字节清零. 头文件:#include <string.h> eg.
- Java中Stringbuffer、Arrays、Interger、Character类的特性
1:StringBuffer(掌握) (1)用字符串做拼接,比较耗时并且也耗内存,而这种拼接操作又是比较常见的,为了解决这个问题,Java就提供了 一个字符串缓冲区类.StringBuffer供我们使 ...
- Android中Service的使用
我个人的理解是:我们平时使用的android系统的app的后台应用,就是这个原理 可以利用Service实现程序在后台运行,依照这个原理,可以通过Service来实现关键代码的运行与实现. <一 ...
- UIkit框架之UISegmentedControl
1.继承链:UIcontrol:UIview:uiresponder:NSObject 2.初始化 (1)- (instancetype)initWithItems:(NSArray *)items ...