C语言的类型大小
C语言的类型大小
设计程序的时候我们一般会考虑的尽量的周全,尤其是像C这样的静态类型语言。
有一些溢出的问题就源于没有搞清楚变量的大小范围,所以我们编写的时候需要特别注意
C的整形(整数类型)大小
C的类型大小并没有明确的定义,类型的大小取决于它所用的编译器,所以说同一份代码,在不同平台下编译。有可能会有不一样的结果。
能确保的只有以下几点
- char 类型可以放小于等于127的值;
- short int 和int 可以存放小于等于32767的值;
- long int 可以保存小于等于2 147 483 647的值;
- char 至少有8位,short int 和int 至少有16位,而long int 则至少有32位。
如何确保声明的类型的大小范围符合预期
- 去查看该平台的大小定义,ANSI C中规定在该平台的头文件
<limits.h>应该有明确的定义
或者可以自己编写程序测试
示例代码如下:
#include <stdio.h>
int main() {
int size_byte_of_char = sizeof(char);
int size_of_char = size_byte_of_char*8 - 1;
int size_byte_of_short = sizeof(short int);
int size_of_short = size_byte_of_short*8 - 1;
int size_byte_of_int = sizeof(int);
int size_of_int = size_byte_of_int*8 - 1;
long int size_byte_of_long = sizeof(long int);
long int size_of_long = size_byte_of_long*8 - 1;
printf("char size = %d\n",(1<<size_of_char) - 1);
printf("short size = %d\n",(1<<size_of_short) - 1);
printf("int size = %d\n",(1<<size_of_int) - 1);
printf("long size = %ld\n",(long)((1l<<size_of_long) - 1));
return 0;
}
64位系统下运行结果:
Kevin@~ $ gcc main.c -o intsize
Kevin@~ $ intsize ./intsize
char size = 127
short size = 32767
int size = 2147483647
long size = 9223372036854775807
- 在C语言中有些库帮我们做好这种事了
那就是<inttypes.h>
这里面用宏定义定义好了我们需要的大小的类型,例如int8_t、uint8_t、int16_t从8、16、32、64都有。
这个非常容易理解
8就是指长度为8位的整形,即最大127,最小-127。那么加个u就是无符号的8位整形,即,0~255。
16、32依此类推。
总结
总之,C是一门需要程序员多走一步的语言,它默认使用它的人懂得它的禁忌。
所以说C入门不难,但是深入理解它很难。只有实际碰到了才会知道它的各种特性。
最近实在有点懒,在这里对我的粉丝们说声对不起
C语言的类型大小的更多相关文章
- C语言各类型大小,结构体大小 sizeof(struct A)
C语言类型大小总览 编译器pack指令 #pragma pack(n)——定义n字节对齐 C++固有类型的对齐取编译器对齐与自身大小中较小的一个 32位C++默认8字节对齐.gcc编译器默认4字节对齐 ...
- C语言整数类型在X86和X64下的字节大小
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 f ...
- 深入理解计算机各种类型大小(sizeof)
深入理解计算机各种类型大小(sizeof) // Example of the sizeof keyword size_t i = sizeof( int ); struct align_dep ...
- C语言指针类型 强制转换
关于C语言指针类型 强制转换 引用一篇文章: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值.不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个 ...
- 3. Go语言基本类型
Go语言基本类型如下: bool string 数值类型 (int8, int16, int32, int64, int, uint8, uint16, uint32, uint64, uint, f ...
- 学习Golang语言(6):类型--切片
学习Golang语言(1): Hello World 学习Golang语言(2): 变量 学习Golang语言(3):类型--布尔型和数值类型 学习Golang语言(4):类型--字符串 学习Gola ...
- C语言指针的大小
C语言指针的大小 今天看到一道题目是这样的,写出以下变量在32位设备上的大小(占多少个字节) 然后其中就有一些指针类型的数据,那么我们知道在C语言中指针的大小都是一样的,不管是有数据类型的还是void ...
- 生成跨语言的类型声明和接口绑定的工具(Djinni )
Djinni 是一个用来生成跨语言的类型声明和接口绑定的工具,主要用于 C++ 和 Java 以及 Objective-C 间的互通. 示例接口定义文件: # Multi-line comments ...
- web前端对上传的文件进行类型大小判断的js自定义函数
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
随机推荐
- 合并EXCEL文件到一个文件的V宏
我建的宏: Sub 合并文件的VBA() Dim MyPath, MyName, AWbName Dim Wb As Workbook, WbN As String Dim G As Long Dim ...
- 【题解】切割多边形 [SCOI2003] [P4529] [Bzoj1091]
[题解]切割多边形 [SCOI2003] [P4529] [Bzoj1091] 传送门:切割多边形 \(\text{[SCOI2003] [P4529]}\) \(\text{[Bzoj1091]}\ ...
- 五、Zookeeper基于API操作Node节点
安装zookeeper :linux下安装Zookeeper 3.4.14 zookeeper 分为5个包: org.apache.zookeeper //客户端主要类文件 org.apache.zo ...
- C++ 虚函数表与多态 —— 继承的虚函数表 & 内存布局
1. 使用继承的虚函数表: 如果不涉及多重继承,每个类只有1个虚函数表,当子类继承父类后,子类可以自己改写和新增虚函数,如下图所示: 子类重写 func_1 后,子函数的 func_1 将会有新的逻辑 ...
- 2020-2021-1 20209307 《Linux内核原理与分析》第九周作业
这个作业属于哪个课程 <2020-2021-1Linux内核原理与分析)> 这个作业要求在哪里 <2020-2021-1Linux内核原理与分析第九周作业> 这个作业的目标 & ...
- SQL注入fuzz字典
length Length + handler likeLiKe selectSeleCT sleepSLEEp databaseDATABASe delete having oroR asAs -~ ...
- ActiveMq PUT任意文件上传漏洞(CVE-2016-3088)漏洞复现
漏洞原理 该漏洞出现在fileserver应用中,ActiveMQ中的fileserver服务允许用户通过HTTP PUT方法上传文件到指定目录.Fileserver支持写入文件(不解析jsp),但是 ...
- 【原创】Linux PCI驱动框架分析(一)
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- qs的工具方法讲解
简单来说,qs 是一个增加了一些安全性的查询字符串解析和序列化字符串的库. 今天在学习同事的代码, 在学习过程中遇到了这样一句代码 研究了很久,只了解了个大概,后面慢慢的用熟练只会,想着做个总结,温习 ...
- Spring Boot 2.4版本前后的分组配置变化及对多环境配置结构的影响
前几天在<Spring Boot 2.4 对多环境配置的支持更改>一文中,给大家讲解了Spring Boot 2.4版本对多环境配置的配置变化.除此之外,还有一些其他配置变化,所以今天我们 ...