C语言嘿嘿嘿

本文详细介绍了计算机容量单位(如K、M、G、T)、C语言中数据类型(如char、int、long)的存储空间及转换规则,并探讨了赋值操作中的补码和位移技巧。通过实例演示了整数的正负表示与逻辑/算术右移的区别。
摘要由CSDN通过智能技术生成

计算机常用的容量单位

2 10 = 1K
2 20 = 1M
2 30 = 1G
2 40 = 1T

2 32 = 22*230=4G
213 = 23*210=8K

8bit 可以表示 28=256钟状态
内存是以字节为单位操作的
软件中的最小单位 1B = 8bit

C语言数据类型及容量

参考菜鸟教程C数据类型

变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式

ANSIC 规定:
char 是1B
long 类型不小于4B
char <= short <= int <= long

short 一般2B
int 整型本质上来说表示CPU的处理能力
一些单片机或低位系统 int 2B,PC常见 4B
long windows 4B, linux64位 8B
怎么判断在自己编译器的具体规则呢?
利用sizeof()把int, long 大小打出来。
常见uint8_t、int32_t、是对数据类型容量见名知意的别名
无符号int 类型8位, 有符号int 类型32位,_t表示用typedef 起的别名

C语言默认数据输入的进制格式

数据在计算机中都是以补码的形式保存的。

  1. 单纯的默认都是10进制的形式:a = 10;
  2. 0x表示16进制:a = 0xcc;
  3. 0b表示2进制:a = 0b11110001;
  4. 0开头表示8进制:a = 010;

赋值操作

= :把等号右边的内存中的01,2进制数据,逐一拷贝到左边
前面提到过变量类型
变量的类型决定了变量存储占用的空间,以及如何解释存储内存上的2进制串
涉及到赋值就要考虑容量大小的问题
整形常量 默认 int大小 4B.
char 是 1个字节。大容量向小容量赋值,截断,存储低位数据。
char a = 0x12345678;
其实赋值后,a 在内存上数据存储的2进制数据是0x78;

C语言中的 赋值 只关注等号两边的容量大小,拷贝的是内存上纯粹的2进制数据串,而容量的大小是由数据类型来约束的。

数据类型不仅约束了内存区域上容量大的大小,而且又分了有符号和无符号影响后续操作。

不管正负数据,在计算机中都以补码形式存储

数据左右移动的符号问题

有无符号关注后续操作
当数据左移的时候,添0即可。
当数据右移时,看其是否是有符号数。若是无符号数,添0;若是有符号数,添加符号位。

/*
【基础题】已知代码如下,请写出执行结果:
int main() {
    unsigned int b = -100;
    printf("%d\t%u\t%x\n", b, b, b);
    printf("%d\t%d\n", b >> 1, b << 1);
    return 0;
}
    -100在计算机(4B)中的存储形式
    1111 1111 1111 1111 1111 1111 1001 1100
    %x f    f    f    f    f    f    9    c
    %u 4294967196
    %d -100

    逻辑右移动 填0  unsigned int
    算术右移	填符号位 
    1111 1111 1111 1111 1111 1111 1001 1100
    逻辑右移 >>1
    0111 1111 1111 1111 1111 1111 1100 1110>>0
    %x d    f    f    f    f    f    c    e
    %u 3,758,096,334
    %d 2,147,483,598

    <<1
    1111 1111 1111 1111 1111 1111 1001 1100
    左移(应该就在右边补0)
 1<<1111 1111 1111 1111 1111 1111 0011 1000
    %x f    f    f    f    f    f    3    8
    (最左边符号位1:代表负数,此时是补码形式)
    %d 显示负数时,会将负数的补码转换成原码加上符号输出
    补码
    1111 1111 1111 1111 1111 1111 0011 1000
    反码
    1111 1111 1111 1111 1111 1111 0011 0111
    原码
    1000 0000 0000 0000 0000 0000 1100 1000
    %d -200

*/
#include<stdio.h>
int main(int argc, char const *argv[])
{
    unsigned int b = -100;
    printf("%d\t%u\t%x\n", b, b, b);
    printf("%d\t%d\n", b >> 1, b << 1);
    return 0;
}
结果输出:
-100    4294967196      ffffff9c
2147483598      -200

~x + x = -1
一个数取反,加上他本身等于-1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值