精华内容
下载资源
问答
  • C语言整数类型 char 1个字节 ASCII码和字符是一一映射关系 1个字节,1byte(字节) = 8bit(比特),用 0,1存储 short 2个字节 int 4个字节 long 4个字节 long long 8个字节 float 4个字节 double 8个字节 无...

    C语言整数类型

    char 1个字节 ASCII码和字符是一一映射关系 1个字节,1byte(字节) = 8bit(比特),用 0,1存储
    short 2个字节
    int 4个字节
    long 4个字节
    long long 8个字节
    float 4个字节
    double 8个字节

    无符号:unsigned char 不能表示负数
    有符号:signed char 能表示负数
    默认signed char

    #include <stdio.h>
    int main()
    {
    	//整数类型
    	//char			ASCII码和字符是一一映射关系  1个字节,1byte(字节) = 8bit(比特), 0,1
    	//无符号,有符号
    	//unsigned char		不能表示负数
    	//signed char		能表示负数
    	//默认 signed char
    	//数据溢出
    	auto signed char ch = 128;
    	printf("ch = %d\n", ch);
    	//整形:默认 signed int
    	//short		
    	//unsigned short	0 -> 2^16-1		65535
    	//signed short		-2^15->2^15-1	-32768->32767
    	//int	4个字节(自然整形)适合机器
    	//unsigned int		0-》2^32-1		42亿		4G		0-》4294967295
    	//long 4个字节
    	//long long			0->2^64-1
    	//float				4个字节			6为小数
    	//double			8个字节			15为小数
    	return 0;
    }
    
    ![数据溢出情况分析](https://img-blog.csdnimg.cn/20191116190247944.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxMDgyODQ2,size_16,color_FFFFFF,t_70)
    
    展开全文
  • 本人之前从来不知道C语言类型转换函数,一般的书上也没有介绍这些函数,今天用到一个要去float的整数部分的功能,于是就强制类型转换,然后一直出问题。调试了半天,发现是不同编译器的强制类型转换有不同结果,有...

    概述

    本人之前从来不知道C语言有类型转换函数,一般的书上也没有介绍这些函数,今天用到一个要去float的整数部分的功能,于是就强制类型转换。虽然知道强制转换是抛弃其小数部分,但是如果我要用四舍五入的方法呢?

    强制类型转换

    使用GCC编译器,版本为TDM-GCC 4.9.2

    	float a,b;
    	a = 186.453;
    	b = 186.999;
    	int n = (int)(a);
    	int m = (int)(b);
    	cout << n << '\n' <<m;
    

    运行结果:

    186
    186
    

    分析:

    在C++中,发现强制类型转换并不会四舍五入,会抛弃其小数部分,也就是说验证了其正确性;

    ceil(往上取最小整数)/round(四舍五入)/floor(取整数部分)

    可以点击下面链接,写的挺好的
    https://blog.csdn.net/aouixh/article/details/53483556

    这里总结一下:
    有一个数据1.234
    1.我要取整数部分,要1
    可以使用floor函数(地板的意思),也可以强制转换;
    2.我取比这个数大,即我要数据为2
    可以使用方法1加上一个整数1,也可以使用ceil函数;
    3.我要四舍五入的值
    使用函数round;
    (注意,还有一种取巧的方法,就是让这个数加上0.5f,具体实现方法可以自己想一想)

    说明一下,在C中的math.h中有2中定义
    double ceil(double x);
    float ceil(float x);
    在c++中,增加
    long double ceil(long double x);
    
    展开全文
  • C语言整数类型问题

    2019-10-19 00:18:33
    阶乘不都是整数吗。。[img=https://img-bbs.csdn.net/upload/201910/19/1571415508_105551.jpg][/img][img=https://img-bbs.csdn.net/upload/201910/19/1571415511_130590.jpg][/img][img=...
  • C语言中,char表示占用一个byte空间,在机器上一个byte可存储的范围是0000 0000 b ~ 1111 1111 b, 现在不考虑符号问题,仅仅把它解释为无符号的整数,那么对应十进制范围是0 ~ 255, 现在我们的a初始值是255 即 ...

    作者:autogeek

    原文链接:http://www.cnblogs.com/autogeek/p/4321635.html

    1.先从一个列子引出问题:

    //sample_1 unsigned char 
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        unsigned char a = 255;
        a = a + 1;
        printf("a = %d\n", a);
        return 0;
    }

    输出结果:

    image

    为什么是0 而不是256, 这是很显然的发生了溢出。现在从机器存储的角度来看这个问题:

    在C语言中,char表示占用一个byte空间,在机器上一个byte可存储的范围是0000 0000 b ~ 1111 1111 b, 现在不考虑符号问题,仅仅把它解释为无符号的整数,那么对应十进制范围是0 ~ 255, 现在我们的a初始值是255 即 1111 1111 b,接着给它加1,那么二进制运算后变为 1 0000 0000 b, 由于进位,结果变成了9个bit,但是别忘了char是只占一个byte的,所以最前面的那个bit 将会被丢弃,结果变成 0000 0000 b, 因此输出结果会是0.

    这个列子说明,整数在机器上存储的方法是满足二进制的运算律的,但是当用一定类型表示出来时,这个二进制的值就要按照那个类型的约束表现出来,就像上面的列子一样,即使最后的二进制结果是9个bit,但是char类型明确约束你只能占8个bit,最后只能丢弃1个bit之后按8个bit的结果展示出来。

     

    2.第二个列子,引入有符号类型的表示问题:

    //sample_2 signed char
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        char a = 127;
        a = a + 1;
    
        printf("a = %d\n", a);
        return 0;
    }

    输出结果:

    image

    先不忙分析问题原因,先来搞清楚负数是如何在计算机上存储的。简单的说,计算机擅长做0和1的加法,并不愿意像人类用的十进制一样去引入负号这个东西,否则会增加硬件和软件的复杂性和成本,如何解决这个问题,众所周知的就是用补码。可以举个列子去理解补码的作用,1+(?)= 0,很显然 1 + (-1)= 0, 这样就把减法问题转化为加法问题,那么在计算机中怎么去表示(-1)? 同样的,我们站在计算机的角度想问题(先拿一个byte的来举例),(0000 0001 b) + (?) = (0000 0000 b), 当然是(0000 0001 b) + (1111 1111 b) = (0000 0000 b),因此(1111 1111 b) 就是十进制1(原码)的补码,教科书中说补码可以通过对原码取反加一得到,其实通过上面的列子可以换一种角度解读补码的含义:即补码就是那个使得和原码相加之后结果能够为0的数。说了这么多,就是想说明对一个byte来说,(-1)在计算机上存储为(1111 1111 b)。

    那么对于有符号char型来说,还是一个byte的空间,还是0000 0000 b ~ 1111 1111 b的范围,但是现在要把这个范围按有符号整数的表示来翻译了,可以分为3部分来理解,即 < 0,0 ,> 0,0000 0000 b显然是0, 0000 0001 b ~ 0111 1111 b显然是 1 ~ 127, 1000 0000 b ~ 1111 1111 b 是 –1 ~ –128。由此也可以发现,可以把最高位作为符号位来理解,0正1负。

    image

    换一种表达方式 (图画的太渣了,求推荐好的画图工具)

    image

    上面这两张图希望能表达清楚我上面的分析结论,即计算机上存储的整数一定是满足二进制的运算律的,但是怎么去解释它就取决于整型变量的类型约束条件了。

    说了这么多,再来解释第二个列子就简单多了。第一步char a = 127 说明a是有符号的,127在计算机上存储为0111 1111b, 第二步 a = a + 1,a在计算机上变成了1000 0000b, 对应上面的分析,把它按照有符号数来解释即 -128,因此输出-128。

     

    3.上第三个列子,关于符号位扩展问题:

    //sample_3
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        char a = 127;
        a = a + 1;
    
        printf("a = %u\n", a);
        return 0;
    }

    输出结果:

    image

    我只是将sample_2的代码中%d改成了%u,输出结果就差之千里,其实还是一个道理,用不同的方式解释计算机存储的二进制值就会得到不同的结果。当然这里还涉及符号位扩展以及类型提升。

    首先说类型提升,%d表示打印int类型有符号十进制数,%u表示打印int无符号十进制数,当a被打印时隐式的发生类型提升,即char被提升为int,即8位被扩展为32位。

    对于sample_3来说:

    a的值在1个byte中,是 0111 1111b

    a加1后在1个byte中,是 1000 0000b

    a的值被类型提升并扩展为4个byte后,是11111111 11111111 11111111 10000000 b,按照%u来解释是多少呢,当然是4294967168。

    可是为什么扩展后前面的空位都是补1而不是补0呢,这个有个原则是 “有符号数扩展符号位,也就是向前补1,无符号数扩展0”。

    那么sample_2应该也发生类型提升和符号扩展,为什么没出问题呢。因为虽然a的值被类型提升并扩展为4个byte后,依然是11111111 11111111 11111111 10000000 b,按照%d来解释,他是00000000 00000000 00000000 10000000 b的补码,所以表达为-128。

    以上是自己的一些理解,难免有错误,欢迎讨论。

    转载于:https://www.cnblogs.com/autogeek/p/4321635.html

    展开全文
  • (这句话中的int其实是上面表格中的long int,因为C语言为了保持跨平台的统一,所以char, short int, int, long long int都采用了固定位数,不随系统位数变化而变化,但是long int类型是根据系统位数决定的!...
    C声明 32位机器(X86) 64位机器(X64)
    char 1 1
    short int 2 2
    int 4 4
    long int 4 8
    long long int 8 8
    char * 4 8
    float 4 4
    double 8 8

    几个注意点:

    1:指针类型变量的大小只取决于计算机系统的位数,它的大小也等于该计算机系统的int类型大小,即该计算机系统“字”的大小。(这句话中的int其实是上面表格中的long int,因为C语言为了保持跨平台的统一,所以char, short int, int, long long int都采用了固定位数,不随系统位数变化而变化,但是long int类型是根据系统位数决定的!)

    2:在32位系统下,是无法直接操作64位的整数的,所以32位下的long long int的操作是编译器通过一系列位运算完成的。

    3:一个计算机系统的寻址能力由“字”决定,例如:32位系统下的“字”大小为32位(意思就是采用32位大小的整数来表示每个内存地址),所以寻址能力为2的32次方,地址范围为0 ~ 2^32 - 1。

    转载于:https://www.cnblogs.com/ryzz/p/9418171.html

    展开全文
  • C语言允许使用八进制整数与十六进制整数,八进制整数加前导0(数字),十六进制整数加前导0X。 int a = 100; 也可以这样写: int a = 0144; // 4+8*4+1*8*8=100 用八进制表达时,不能少了最前的那个0。否则...
  • 基本数据类型 基本整数数据类型包括int,char等,具体见下表,各种类型的存储大小与系统位数有关,但目前...当从小范围到大范围的时候需要扩充,反之需要截断,如果整数类型是有符号的,填充就是符号位,无符号的就是填
  • 大家都知道C语言整数的表达类型比较多 记起来也比较复杂 不像python php 等对类型的区分不是那么明确,那是因为现在计算机的内存越来越大了,不用那么严格的考虑内存。而C语言当初设计出来的时候对内存大小的考虑是...
  • C语言整数

    2020-11-12 19:27:09
    整数是我们生活中常用的数据类型,也是编程中常用的一种数据,C语言使用int关键字来定义整数变量(int是 integer 的简写)。 在定义变量的时候,可以加signed、unsigned、short和long四种修饰符。 signed:有符号的...
  • C语言整数运算 c语言整数特点 分为有符号和无符号 有符号和无符号运算,会将有符号转换为无符号 默认整数数字都是有符号的 例子 说明:在表达式中没有u或强制类型转换,会按照有符号来运算 关系表达式 类型 ...
  • C语言整数的输出

    2020-04-17 12:21:53
    整数是我们生活中常用的数据类型,也是编程中常用的一种数据,C语言用int关键字来定义整数变量(int是 integer 的简写)。 在定义变量的时候,可以加signed、unsigned、short和long四种修饰符。 signed:有符号的,...
  • C语言整数的取值范围以及数值溢出 short、int、long 是C语言中常用的三种整数类型,分别称为短整型、整型、长整型。 在现代操作系统中,short、int、long 的长度分别是 2、4、4 或者 8,它们只能存储有限的数值,当...
  • C语言字符类型和整数类型的通用性

    千次阅读 2014-11-24 23:49:10
    向字符变量赋予整数 #include void main() { char c1,c2; c1=97; c2=98; printf("%c %c/n",c1,c2); printf("%d %d/n",c1,c2); } 大小写字母的转换 #include void main() { char c1,c2; c1='a';...
  • C语言整数的取值范围

    2020-04-13 15:50:47
    整数是我们生活中常用的数据类型,也是编程中常用的一种数据,C语言使用int关键字来定义整数变量(int是 integer 的简写)。 在定义变量的时候,可以加signed、unsigned、short和long四种修饰符。 signed:有符号的...
  • C语言 整数形式输出

    千次阅读 2019-02-04 10:46:37
    类型转换字符%d的使用。 main() { int num1=123; long num2=123456; /*用3种不同格式,输出int型数据num1的值*/ printf(&quot;num1=%d,num1=%5d,num1=%-5d,num1=%2d\n&quot;, num1,num1,num1,...
  • C语言三种整数类型

    2019-10-05 03:27:45
    1,int 是 C 语言的基本整数类型,可以满足我们处理一般数据的需求。  C 语言还提供了四个可以修饰 int 的关键字:short、long、signed,以及 unsigned。  利用这四个关键字,C 语言标准定义了以下整数类型: ...
  • 目录int类型八进制和十六进制 int类型 声明int变量 int age; int month, day; 初始化变量 int age = 11; int month = 7,day = 29; int dogs, cats = 49; //有效,但格式很糟糕。 int类型常量:11、7、29都是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,341
精华内容 2,136
关键字:

c语言整数类型

c语言 订阅