C语言----数据类型和取值范围及输出格式
基本数据类型
在基本类型中的整数类型、浮点数类型和字符类型都已经在之前的文章中使用过了,这里面的_Bool
是布尔型,只能取 0 和 1 两个值;
数据类型的限定符
short , long, long long
我们可以为这些基本数据类型加上一些限定符,比如表示长度的 short 和 long。比如 int 经过限定符修饰之后,可以是 short int,long int,还可以是 long long int。其中 short int表示所占内存比int小的数据类型,而long int表示所占内存比int大的数据类型。
在 C 语言并没有限制 int 的大小,更没有限制short int等带限定符的数据类型的大小,只是规定了
`short int` <= `int` <= `long int` <= `long long int`
signed 和 unsigned
还有一对类型限定符是 signed 和 unsigned,它们用于限定 char 类型和任何 int 类型变量的取值范围。signed 表示该变量是带符号位的,而 unsigned 表示该变量是不带符号位的。带符号位的变量可以表示负数,而不带符号位的变量只能表示正数,它的存储空间也就相应扩大一倍。默认所有的整型变量都是 signed 的,也就是带符号位的。
对于 int 类型的变量来说,有四种表示长度的限定符(除int本身外,还有 short,long 和 long long),在加上符号位的限定signed和 unsigned,所以一共存在着 8 种int 类型的变量。
sizeof 运算符
sizeof 用于获得数据类型或表达式的长度,它有三种使用方式:
sizeof(type_name); //sizeof(类型),即某一种类型的变量所占内存大小;
sizeof(object); //sizeof(对象),即某一个对象所占内存大小;
sizeof object; //sizeof 对象,查看对象占用内存大小的另一种表达方式;
各类型的输出格式
int 输出为printf("%d", val);
char 输出为printf("%c", cha); 或者 printf("%d", cha)
unsinged short 输出为printf("%u", val);
float 输出为printf("%f", val);
double 输出为printf("%lf", val);
long long 输出为printf("%lld", val);
输入为scanf("%lld", val);
unsinged long long 输出为printf("%llu", val);
输入为scanf("%llu", val);
unsinged long long 输出为printf("0x%016llx", val);//64位十六进制数,完整输出64位十六进制数.
在 MATLAB 中:
- 如果要将某几位置 1,只需与这几位是 1 的数进行或操作即可。
- 如果要将某几位置 0,只需与这几位是 0 的数进行与操作即可。
- 在进行取反运算的过程中切不可简单地认为一个数取反后的结果就是该数的相反数,即~
- 19 的值是-19,这是错误的。
- 异或运算经常被用到一些比较简单的加密算法中。
/*
* %d:输出十进制整数
* %f:输出浮点数
* %s:输出字符串
* %c:输出字符
* %p:输出指针值
* %u:输出无符号整数
* %x:输出十六进制整数
* %o:输出八进制整数
* %n:输出已写入的字符数
* %%:输出百分号符号
**/
64位十六进制数.完整输出 64位十六进制数.
在 C 语言中,unsigned long long
通常是 64 位(8 字节)的数据类型,可以存储 0x123456789ABCDEF0
这样的 64 位十六进制数。但由于 printf
的默认格式化选项可能无法完整输出 64 位十六进制数(特别是在某些编译器或平台上),我们需要使用正确的格式说明符来确保完整输出。
方法 1:使用 %llx
或 %llX
(小写/大写十六进制)
-
%llx
:以小写字母输出十六进制(a-f
)。 -
%llX
:以大写字母输出十六进制(A-F
)。
代码示例
#include <stdio.h>
int main()
{
unsigned long long num_64 = 0x123456789ABCDEF0;
printf("完整输出(小写):0x%llx\n", num_64);
printf("完整输出(大写):0x%llX\n", num_64);
return 0;
}
输出结果:
完整输出(小写):0x123456789abcdef0
完整输出(大写):0x123456789ABCDEF0
方法 2:使用 PRIx64
/ PRIX64
(跨平台兼容)
-
如果代码需要在不同平台(如 Windows、Linux、嵌入式系统等)运行,建议使用
<inttypes.h>
提供的宏:-
PRIx64
→%llx
(小写) -
PRIX64
→%llX
(大写)
-
代码示例
#include <stdio.h>
#include <inttypes.h>
int main()
{
unsigned long long num_64 = 0x123456789ABCDEF0;
printf("完整输出(小写):0x%" PRIx64 "\n", num_64);
printf("完整输出(大写):0x%" PRIX64 "\n", num_64);
return 0;
}
输出结果:
完整输出(小写):0x123456789abcdef0
完整输出(大写):0x123456789ABCDEF0
方法 3:补齐前导零(固定 16 位十六进制输出)
如果希望输出固定 16 位(64 位十六进制数),可以用 %016llx
或 %016llX
补齐前导零:
printf("补齐前导零:0x%016llX\n", num_64);
输出结果:
补齐前导零:0x123456789ABCDEF0
总结
方法 | 说明 | 示例 |
---|---|---|
%llx / %llX | 直接输出 64 位十六进制数 | printf("0x%llX", num_64); |
PRIx64 / PRIX64 | 跨平台兼容写法 | printf("0x%" PRIX64, num_64); |
%016llx | 补齐前导零(16 位) | printf("0x%016llX", num_64); |
如果你的编译器支持 C99 或更高版本,推荐使用 PRIx64
/ PRIX64
以确保跨平台兼容性。