int,signed int和unsigned int 以及printf 的%u,%d的区别

2024-11-22 07:39:47
推荐回答(1个)
回答(1):

int、signed
int、unsigned
int
都是对一个类型的说明,即程序员需要将这个数据作为这种类型在内存中进行存储那么就定义成相应的类型,细致来说:
int
表示这是一个整数类型(interger),没有加其他修饰符默认为有符号的即signed
int
signed
int加了signed修饰符,表示这是一个有符号整数类型
unsigned
int
加了unsigned修饰符,表示这是无符号整数类型
以上是定性来看,更细致来说,对32位机器以及32位编译器来说(所谓32位机器指可以处理的通用寄存器最高位数是32位,32位编译器指编译出来的程序使用的最高位数寄存器是32位的):
使用32位来表示一个int类型的整数,那么这三种定义方式会导致一个数在内存中的存储方式,即:
int/signed
int:使用补码方式表示一个32位数据,简单的来说正数正常表示,负数为相应的正数取反+1。这样表示最高位为1表示为负数,为0为正数。
unsigned
int:直接表示一个32位数据,没有符号位,直接用全部的32位数据表示一个非负正数。
以上就是大概的int,signed
int和unsigned
int的区别。
printf()中的%u和%d的区别:
首先你要知道printf是一个转换器,就是将内存中的数据转换成屏幕输出的格式,因为内存中的格式是一种编码,而输出到屏幕的编码是另一种(全英文的话你可以简单的看成ascii、中文gbk2312、utf-8这要看窗口如何设置......而更准确的是现代操作系统是没有字符模式的,全是图形模式进行渲染,这里可以进行忽略)
既然是转换,那么我需要对printf表示给它提供的这块内存地址中的数据是什么格式的数据,这样printf才好对其进行转换。于是这里是用%u类似这种方式标记内存中的类型,以期望printf根据我们输入的格式对这块内存中的数据进行一个解释。
因此,这里%u表示,我们希望printf对这块数据进行unsigned
int类型的解析,并将解析后的字符结果输出到屏幕。
而%d表示,希望以int或者说unsigned
int的类型对这块数据进行解析了。printf其他功能也类似,一者控制对内存进行怎样格式的解析,二者控制输出成字符称为什么样的格式。
以上。