c语言学习笔记1

反码

正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反

1111代表-0,0000代表+0,在我们实数的范围内,0有正负之分吗?

0既不是正数也不是负数,那么显然这样的表示依然不够合理!

补码

正数的补码就是其本身 (不变!)
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)

4bit位能够表示的范围是:-8~+7(C使用的就是补码!)

格式控制符

说明

%s

输出一个字符串

%c

输出一个单一的字符

%hd、%d、%ld

 以十进制、有符号的形式输出 short、int、long 类型的整数

%hu、%u、%lu

以十进制、无符号的形式输出 short、int、long 类型的整数

%f、%lf

以十进制的形式输出 float、double 类型的小数

%e、%le %E、%lE

以指数的形式输出 float、double 类型的小数。如果 e 小写,那么输出结果中的 e 也小写;如果 E 大写,那么输出结果中的 E 也大写。

%g、%lg %G、%lG

以十进制和指数中较短的形式输出 float、double 类型的小数,并且小数部分的最后不会添加多余的 0。如果 g 小写,那么当以指数形式输出时 e 也小写;如果 G 大写,那么当以指数形式输出时 E 也大写

#include <stdio.h>

int main() {
    char c = 'A';
    printf("变量c的值为:%c 对应的ASCII码为:%d", c, c);   //这里我们使用%c来以字符形式输出,%d输出的是变量数据的整数形式,其实就是对应的ASCII码
}

A 65

#include <stdio.h>

int main() {
    char c = 66;
    printf("变量c的值为:%c 对应的ASCII码为:%d", c, c);
}

B 66

无符号数

我们知道,所有的数据底层都是采用二进制来进行保存的,而第一位则是用于保存符号位,但是如果我们不考虑这个符号位,那么所有的数都是按照正数来表示

int main() {
    unsigned char c = -65;   //数据类型前面添加unsigned关键字表示采用无符号形式
    printf("%u", c);    //%u以无符号形式输出十进制数据
}

65二进制1000001,-65 11000001,-65补码10111111,

由于现在没有符号位,一律都是正数,所以,10111111  =  128 + 32 + 16 + 8 + 4 + 2 + 1 = 191

我们没有为其设定初始值,那么它的值就是不确定的了(千万注意并不是不设定值默认就是0)

类型转换

#include <stdio.h>

int main() {
    int a = 511;
    char b = a;   //最大127
    printf("%d", b);
}

很明显char类型是无法容纳大于127的数据的,因为只占一个字节,而int占4个字节,如果需要进行转换,那么就只能丢掉前面的就只保留char所需要的那几位了,所以这里得到的就是-1:

  • 511 = int  ->  00000000 00000000 00000001 11111111
  • char   ->   11111111   ->    -1

小数类型在转换回整数类型时,会丢失小数部分(注意,不是四舍五入,是直接丢失小数!)

 


版权声明:本文为Y719K314原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。