C语言-整数:short、int、long、long long(signed和unsigned)、原码、反码、补码

一、实验环境

Windows 10 系统
Visual Studio 2019

二、C语言整数简介

1、类型说明符

类型说明符字节数输入输出格式取值范围
short int2%hd- 32768 ~ 32767(5位十进制数)
unsigned short int2%hu0 ~ 65535(5位)
int4%d- 2147483648 ~ 2147483647(10位)
unsigned int4%u0 ~ 4294967295(10位)
long int4%ld- 2147483648 ~ 2147483647(10位)
unsigned long int4%lu0 ~ 4294967295(10位)
long long int8%lld或%I64d- 9223372036854775808 ~ 9223372036854775807(20位)
unsigned long long int8%llu或%I64u0 ~ 18446744073709551615(20位)

这里需要注意,上述字节数是我当前环境下的字节数。C语言中规定:长整型(long int)至少和整型(int)一样长,整型(int)至少和短整型(short int)一样长,即 short int <= int <= long int
编译系统给int型数据分配的内存可能是2个字节或是4个字节,具体由编译系统自行决定。例如:Turbo C 2.0分配的是2个字节,而Visual C++则分配4个字节。1

(1) signed和unsigned

C语言中整数分为有符号类型(signed)和无符号(unsigned)类型。如果没有显示说明为unsigned,则默认为signed。例如:int a即signed int a,long int a即signed long int a。
signed:最高位为符号位,0表示正号,1表示负号。剩下的位数表示数值。
unsigned:没有符号位,所有位数都表示数值。

(2) 省略书写

当int前有signed,unsigned,short,long,long long修饰的时候,int可以省略不写。例如:signed a即signed int a,unsigned a即unsigned int a,unsigned long a即unsigned long int a。

2、sizeof运算符-计算当前环境下各类型的字节数

C语言中sizeof是一个运算符,而不是函数。以字节为单位返回运算对象的大小。运算对象可以是具体的数据对象(如,变量名)或类型。如果运算对象是类型(如,float),则必须用圆括号将其括起来。所以sizeof a,sizeof(a),sizeof(float)都是合法的,其中a是变量名。
sizeof返回size_t类型的值,这是一个无符号整数类型。C头文件系统会使用typedef把size_t作为unsigned int或unsigned long的别名。C99新增%zd转换说明用于printf()显示size_t类型的值,如果编译器不支持%zd,请将其改成%u或%lu。

#include<stdio.h>
int main(void)
{
	printf("short int = \t%zd\n", sizeof(short int));//其中\t是制表符,\n是回车换行
	printf("int = \t\t%zd\n", sizeof(int));
	printf("long int = \t%zd\n", sizeof(long int));
	printf("long long int = %zd\n", sizeof(long long int));

	return 0;
}

输出:

short int =     2
int =           4
long int =      4
long long int = 8

三、整数存储-原码,反码,补码

我解释的很简单,建议看这篇:原码、反码、补码知识详细讲解
下面我以单字节有符号整数1和-1为例:

1、原码

+1:0000 0001 —— 最高位0为符号位,表示正数
-1:1000 0001 —— 最高位1为符号位,表示负数

2、反码

正数的反码与原码相同,负数的反码:符号位不变,其他位取反,即0变1,1变0。
+1:0000 0001
-1:1111 1110

3、补码

正数的补码与原码相同,负数的补码:符号位不变,其他位取反后(即反码)加1
+1:0000 0001
-1:1111 1111

4、小结

正数:原码 = 反码 = 补码
负数:原码 ≠ 反码 ≠ 补码
0 表示为 0000 0000。
正数的范围:1 ~ 127:0000 0001 ~ 0111 1111。
负数的范围:-128 ~ -1:1000 0000 ~ 1111 1111

这里存在一个特殊的数-128
在0的表示上出现了特殊情况。数学中没有+0和-0之分,因为0既不是正数也不是负数。现在我们已经将0000 0000表示成为0,那1000 0000怎么办呢?如果某个数的原码是1000 0000,求其补码,符号位不变,剩余位取反加1,出现了溢出,将溢出位省去,得到的还是1000 0000。在计算机的内部表示中,就将1000 0000定义成数字-128。(我记得书上好像说-128不能求原码和反码,就是强行定义的。我不确定啊,疫情期间,书在学校,人在家中,无法求证。)

计算机采用补码表示负数,是为了避免减法,将减法转换成了加法。所以计算机里只有加法器而没有所谓的减法器。

四、总结

  1. C语言中整型分为有符号和无符号两种。各种类型所能表示数的范围有所不同,根据实际情况选取合适的类型。最常用的是int,不过有时需要存储的数超出int的范围,需要考虑long或者long long(我当前环境下long和int的范围是一样的)。
  2. sizeof是运算符而不是函数,返回值类型是size_t,这是一个typedef定义的一个无符号整型的别名。运算对象是类型说明符时,必须加上括号。
  3. 原码、反码、补码,存储负数,消灭减法。

五、文末声明

  1. 我学习参考的是书本和网络,文章旁征博引(这是个好词),对引用的部分我都标上了链接,有些遗漏的或者一两句话没标注的,如果侵权万分抱歉,联系我后必删。

  2. 我写博客旨在监督自己学习,与大家分享学习成果,脚踏实地,一步踩死一个bug。由于本人水平极其有限,文中有出错的地方还请读者批评指正。


  1. C语言中 int、long、long long 的存储空间和值的范围 ↩︎

  • 19
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
unsigned longintC语言中的两种整数类型。unsigned long int是无符号长整型变量,可以存储的范围是0到4294967295,即0到2的32次方减1。而int是整型变量,可以存储的范围是-2147483648到+2147483647。在一般情况下,unsigned longint的范围是不同的,unsigned long可以存储更大的正数,而int可以存储更大的负数。如果需要将unsigned long int转换为int,特别是当unsigned long int的值大于int的范围时,可以使用类型转换操作符将其转换为int类型。但是需要注意的是,转换后的值可能会溢出或失去精度。因此,在进行类型转换时,需要谨慎处理数据的范围和精度。 #### 引用[.reference_title] - *1* [关于c ++:如何安全地将unsigned long int转换为int?](https://blog.csdn.net/weixin_32596893/article/details/117244693)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [C语言基本数据类型int, short int, long int, long long int, unsigned int, signed int等解析](https://blog.csdn.net/weixin_44551646/article/details/97536894)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [unsigned long int](https://blog.csdn.net/wmnmtm/article/details/82923709)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值