c语言char 和int的问题
参考:http://www.cnblogs.com/dire/p/5222968.html
参考baidu:
char和int的定义我是清楚的,现在有一个问题:
1、设A和B是int型,C是char型,那么if (C<(A-B)) 这个语句可不可以,有没有BUG存在?
2、设A和B是char型,C是int型,那么C=(A+B); 这个语句有没有问题呢?
3、设A和B是int型,C是char型,那么C=(A+B); 这个语句有没有问题呢?
回答:
C语言是一种弱类型语言,如果使用熟练了你就会知道,类型什么的都是浮云,内存才是王道,考虑问题的时候要深入本质才行,关于这个问题从内存来看,如下:
char是字符型,内存中占用 1 个字节,取值范围是-128到127,int类型占用 4 个字节,范围就不说了,肯定是比char要大的多,这两个都是有符号数。
char和int一般情况下是可以直接做加减运算的,你可以直接把char当成一个int,只不过取值范围小点;
不同类型的数值在做运算时,以尽量不丢失有效数据为原则,比如char和int相加,系统会自动把char转换成int,最终结果也是int型;
赋值时如果类型不一样,要小心,若等号左边的类型小于右边的,会产生截断赋值(特别注意),大于的话就没问题,不会丢失有效数据。
如你写的第一句,A-B是int,C是char,比较时会先把char转换成int,也就是从1个字节变成4个字节,肯定不会丢失有效数据,没问题;
第二句,A+B是int,要赋值给char型C,相当于把4个字节的信息装到1个字节的内存中,这肯定放不下,因此会产生截断赋值,取A+B结果的最后一个字节赋值,前面三个字节则会丢掉,所以这些写会有风险(当然编译肯定是过的,只是警告罢了),这种情况下,如果A+B结果没超过char取值范围,也问题,因为不会丢失有效数据,如果超过了的话,结果就不是它应该有的结果了,这是就要小心了,所以一般别这么写,除非你确定数据不会越界,一旦越界就会截断赋值(只是结果不对,但程序也不会崩溃的)。
#include <stdio.h>
struct SIMPLE
{
int a;
char b;
}; int main(){
//声明结构体变量s1 和 指向结构体变量的指针 s2
struct SIMPLE s1;
struct SIMPLE *s2; s1.a = 5;
s1.b = 6;
s2 = &s1;
printf("%d\n", s2->a);
printf("%d\n", s2->b); printf("%d\n", (*s2).a);
printf("%d\n", (*s2).b);
}
c语言char 和int的问题的更多相关文章
- C语言补漏(1)--- char到int赋值的一个陷阱
作为一个C的新手(虽然学的第一门语言就是C,可是用C实际开发项目却是最近的事情),对使用C过程中遇到的各类问题.疑惑.知识漏洞进行弥补无疑是非常有必要的,于是决定将每次遇到的知识漏洞写到博客上. 今天 ...
- C 语言实例 - 计算 int, float, double 和 char 字节大小
C 语言实例 - 计算 int, float, double 和 char 字节大小 C 语言实例 C 语言实例 使用 sizeof 操作符计算int, float, double 和 char四种变 ...
- 用c++语言编写函数 int index(char *s,char * t),返回字符串t在字符串s中出现的最左边的位置,如果s中没有与t匹配的子串,则返回-1。类似于索引的功能。
首先,分析一下程序的思路: 1:从s的第i个元素开始,与t中的第1个元素匹配,如果相等,则将s的第i+1元素与t中的第2个元素匹配,以此类推,如果t所有元素都匹配,则返回位置i;否则,执行2; 2: ...
- [置顶] C语言中各种数据类型的长度 sizeof char, short, int, long, long long
这些数据类型的sizeof具体长度依赖于编译器和操作系统(32-bit or 64-bit) 1: 首先,参见c99标准 标准中没有定义这些数据类型的长度,而是定义了这些数据类型能表达的大小范围的最小 ...
- C++ 中 char 与 int 转换问题
itoa 功 能:把一整数转换为字符串 函 数:char *itoa(int value, char *string, int radix); 解 释:itoa 是英文integer to ar ...
- while ((ch = getchar()) != EOF)中ch定义为char还是int型?cin、scanf等如何结束键盘输入
2013-07-09 18:55:42 EOF是文件的结束符,具体可以作为文本文件的结束符,也可以作为键盘输入char类型数据时的结束符.对于不同的系统,EOF的定义可能不同,一般定义为-1.因为ch ...
- char,short ,int ,long,long long,unsigned long long数据范围
from:http://www.cnblogs.com/A123456A/archive/2013/01/25/2876634.html char,short ,int ,long,long long ...
- 一段代码了解Java中char和int的转换
题目要求: 将输入的大写字母转成对应小写的后5个,如A转换后为f:如果转换后大于z则从a重新计,即多出1就转成a,多出2就转成b以此类推. Java代码: ```java private static ...
- char与 int 类型转化问题汇总
1.char变为int时高位符号扩展问题 int main() { char a = 0x9a; int util; util = (int)a; if(util > 0) printf(&qu ...
随机推荐
- 记一次MySQL索引优化
两张表是主(CHECK_DRAWINGS)从(CHECK_DRAWINGS_IMG)关系. CHECK_DRAWINGS,主表数据 3591条. SELECT COUNT(*) FROM CHECK_ ...
- linux命令大杂烩之网络管理
在Linux中curl是一个利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具.它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具. 作为一款强力 ...
- cocos2d-x 调用第三方so文件
一:假设.so文件名称 : libhi.so 1.jni文件下创建一个prebuilt 2.android.mk文件中找到 include $(CLEAR_VARS), 在这句后面添加如下代码 in ...
- Mysql的事务、视图、索引、备份和恢复
事务 事务是作为单个逻辑工作单元执行的一系列操作,一个逻辑工作单元必须具备四个属性.即:原子性.一致性.隔离性.持久性,这些特性通常简称为ACID. 原子性(Atomicity) 事务是不可分割的 ...
- Java_Web三大框架之Hibernate+HQL语言基础
12.1 HQL语言基础Hibernate查询语言为HQL(Hibernate Query Language),可以直接使用实体类名及属性.HQL语法类似于SQL,有SQL的关键词如select.fr ...
- http服务器与https服务器的区别
1.HTTPS服务器使用的是HTTPS协议,而HTTP使用的是HTTP协议. 2.HTTPS服务器需要向证书授权中心申请证书,一般免费证书很少,需要交费. 3.HTTP服务器与客户端传递的是明文数据, ...
- log4j最全教程
(转自http://www.codeceo.com/article/log4j-usage.html) 日志是应用软件中不可缺少的部分,Apache的开源项目log4j是一个功能强大的日志组件,提供方 ...
- UICollectionViewFlowLayout & UICollectionViewDelegateFlowLayout
A concrete layout object that organizes items into a grid with optional header and footer views for ...
- Python之进程 基础知识 上
阅读目录 理论知识 操作系统背景知识 什么是进程 进程调度 进程的并发与并行 同步\异步\阻塞\非阻塞 进程的创建与结束 在python程序中的进程操作 multiprocess模块 进程的创建和mu ...
- map集合遍历,放入id
背景,需要从电脑导入excel表格到网页上然后表格中公司需要对应数据库的id 通过key-value方法来对应id Office office = new Office();office.setG00 ...