今天我在逛网页的时候,看见了下面的一行代码:
unsigned number = 7;
当时我有被疑惑到,在我的印象里,定义数字变量时只有三种类型。于是便去百科了一下,了解到 unsigned 其实和 int 有联系的:
int 整型可以划分为带符号的(signed)和无符号的(unsigned)两种,带符号类型可以表示正数、负数或0,无符号类型则仅能表示大于等于0的值。在默认情况下声明的整型变量都是有符号的类型,如果需声明无符号类型的话就需要在类型前加上unsigned关键字。(int 整型是计算机编程语言中的一种基本数据类型,通常反映了所用机器中整数的最自然长度。)
我们用代码演示一下:
#include "stdio.h"int main(){ unsigned int num_one = 5; // 也可以 unsigned num_one = 5; 这样定义 int num_two = -7; /* * %u 控制输出 十进制无符号整数 * %d 控制输出 十进制有符号整数 */ printf("这是输出无符号的结果 %u\n",num_one + num_two); printf("这是输出有符号的结果 %d\n",num_one + num_two); return 0;}
运行结果如下:
这是输出无符号的结果 4294967294这是输出有符号的结果 -2
分析上面的代码,可有发现, num_one + number_two 的值为 -2;因为
printf("这是输出无符号的结果 %u\n",num_one + num_two);
输出的是无符号十进制整数。由于-2<0,所以输出了如上结果。我们将上面的代码修改为如下代码&#xff0c;看看结果&#xff1a;
#include "stdio.h"int main(){ unsigned int num_one &#61; 5; // 也可以 unsigned num_one &#61; 5&#xff1b; 这样定义 int num_two &#61; -7; /* * %u 控制输出 十进制无符号整数 * %d 控制输出 十进制有符号整数 */ printf("这是输出无符号的结果 %u\n",num_one - num_two); printf("这是输出有符号的结果 %d\n",num_one - num_two); return 0;}
结果如下&#xff1a;
这是输出无符号的结果 12这是输出有符号的结果 12
分析代码&#xff1a;发现 num_one - number_two 的值为 12&#xff1b;因为12>0,所以两个结果相同。
C语言中输入输出所有格式控制符
参考CSDN创作者Shy_tom
类型控制符type
type的字符用于规定输出数据的类型&#xff0c;含义如下&#xff1a;
字符 | 对应数据类型 | 含义 |
---|
d / i | int | 接受整数值并将它表示为有符号的十进制整数&#xff0c;i是老式写法 |
o | unsigned int | 无符号8进制整数(不输出前缀0) |
u | unsigned int | 无符号10进制整数 |
x / X | unsigned int | 无符号16进制整数&#xff0c;x对应的是abcdef&#xff0c;X对应的是ABCDEF(不输出前缀0x) |
f(lf) | double | 单精度浮点数和双精度浮点数用f(lf 在C99开始加入标准&#xff0c;意思和 f 相同) |
e / E | double | 科学计数法表示的数&#xff0c;基数为10&#xff0c;此处"e"的大小写代表在输出时用的"e"的大小写 |
a / A | double | 16进制科学计数法表示的数&#xff0c;基数为2,以p表示,以16进制输出&#xff0c;此处"a"的大小写代表在输出时用的"p"的大小写 |
g / G | double | 有效位数&#xff0c;如&#xff1a;%.8g表示单精度浮点数保留8位有效数字 |
c | char | 字符型。可以把输入的数字按照ASCII码相应转换为对应的字符 |
s / S | char * / wchar_t * | 字符串。输出字符串中的字符直至字符串中的空字符(字符串以’\0’结尾&#xff0c;这个’\0’即空字符) |
p | void * | 以16进制形式输出指针 |
n | int * | 到此字符之前为止&#xff0c;一共输出的字符个数&#xff0c;不输出文本 |
% | 无输入 | 不进行转换&#xff0c;输出字符‘%’(百分号)本身 |
m | 无 | 打印errno值对应的出错内容,(例: printf("%m\n"); ) |
注&#xff1a;%g、%G在小数点位数四位或指数大于等于精度时用%e、%E&#xff0c;否则用%f。
2.标志flags
flags规定输出样式&#xff0c;取值和含义如下&#xff1a;
字符 | 字符名称 | 说明 |
---|
- | 减号 | 左对齐&#xff0c;右边填充空格(默认右对齐) |
&#43; | 加号 | 在数字前增加符号 &#43; 或 - |
0 | 数字零 | 将输出的前面补上0&#xff0c;直到占满指定列宽为止(不可以搭配使用"-") |
| 空格 | 输出值为正时加上空格&#xff0c;为负时加上负号 |
# | 井号 | type是o、x、X时&#xff0c;增加前缀0、0x、0X;type是e、E、f、g、G时&#xff0c;一定使用小数点;type是g、G时&#xff0c;尾部的0保留 |
3.输出最小宽度width
用于控制显示数值的宽度&#xff0c;取值和含义如下&#xff1a;n(n&#61;1,2,3,4,5,6…)&#xff1a; 宽度至少为n位&#xff0c;不够以空格填充。&esmp;* 格式列表中&#xff0c;下一个参数还是widthwidth是一个可选的指定最小值字段宽度的十进制数字字符串。如果转换值字符少于字段宽度&#xff0c;该字段将从左到右按指定的字段宽度填充。如果指定了左边调整选项&#xff0c;字段将在右边填充。如果转换结果宽于字段宽度&#xff0c;将扩展该字段以包含转换后的结果。不会发生截断。然而&#xff0c;小的精度可能导致在右边发生截断。
4. 精度.prec
用于控制小数点后面的位数&#xff0c;取值和含义如下&#xff1a;无按缺省精度显示0
当type&#61;d,i,o,u,x时&#xff0c;没有影响&#xff1b;
type&#61;e,E,f时&#xff0c;不显示小数点
n(n&#61;1,2,3…)
当type&#61;e,E,f时表示的最大小数位数&#xff1b;
type&#61;其他&#xff0c;表示显示的最大宽度
prec是指可选的精度。精度是一个.(点)后跟十进制数字字符串。如果没有给出精度&#xff0c;按 0(零)对待。精度指定&#xff1a;
- * d、o、i、 u、x 或 X 转换的最少数字显示位数。
- * e 和 f 转换的基数字符后的最少数字显示位数。
- * g 转换的最大有效数字位数。
- * s 转换中字符串的最大打印字节数目。
5. 类型长度length
类型长度指明待输出数据的长度。因为相同类型可以有不同的长度&#xff0c;比如整型有16bits的short int&#xff0c;32bits的int&#xff0c;也有64bits的long int&#xff0c;浮点型有32bits的单精度float和64bits的双精度double。为了指明同一类型的不同长度&#xff0c;类型长度(length)应运而生&#xff0c;成为格式控制字符串的一部分。
length | 描述 |
---|
h | 参数被解释为短整型或无符号短整型(仅适用于整数说明符&#xff1a;i、d、o、u、x 和 X)。 |
l | 参数被解释为长整型或无符号长整型&#xff0c;适用于整数说明符(i、d、o、u、x 和 X)及说明符 c(表示一个宽字符)和 s(表示宽字符字符串)。 |
L | 参数被解释为长双精度型(仅适用于浮点数说明符&#xff1a;e、E、f、g 和 G)。 |
根据不同的 format 字符串&#xff0c;函数可能需要一系列的附加参数&#xff0c;每个参数包含了一个要被插入的值&#xff0c;替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。 [2]
6. 转义序列
这些转义序列在字符串中会被自动转换为相应操作命令。使用的常见转义字符如下&#xff1a;
符号 | 意义 | 符号 | 意义 |
---|
\a | 铃声(提醒) | \b | Backspace |
\f | 换页 | \n | 换行 |
\r | 回车 | \t | 水平制表符 |
\v | 垂直制表符 | \’ | 单引号 |
\” | 双引号 | \\ | 反斜杠 |
? | 文本问号 | \ooo(例如\024) | ASCII字符(OCX) |
\xhh (例如:\x20) | ASCII字符(HEX) | \xhhhh | 宽字符(2字节HEX) |
END
客栈科技工作室