一、数在计算机中的二进制表示

符号位:最高位为符号位,正数该位为0,负数该位为1;

原码:原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值

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

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

正数的原码、补码、反码表示方法均相同,不需转换。

任何数值在内存中都是以补码的形式存储的。

  • 正数的补码与原码相同。比如9的原码和补码都是1001。
  • 负数的补码等于它正数的原码按位取反后再+1。

负数补码计算:

1> -10的二进制形式        :1000 0000 0000 0000 0000 0000 0000 1010 //原

2> 除符号位取反             :1111 1111 1111 1111 1111 1111 1111 0101 //反

3> 对取反后的结果+1      :1111 1111 1111 1111 1111 1111 1111 0110 //补

二、基本数据类型

in linux-32:

sizeof(char) = 1
sizeof(int) = 4
sizeof(short int) = 2
sizeof(long int) = 4
sizeof(float) = 4
sizeof(double) = 8
sizeof(long double) = 12
 

三、综合示例,说明变量的二进制表示以及在内存中的分布:

#include "stdafx.h"

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "t.h" void f0(void); typedef struct ds{
unsigned int ui;
int i;
int j;
long int li;
char c;
unsigned char uc;
short int si;
unsigned short int usi;
float f;
double d;
long double ld; char data[];
}DST; int t1(void)
{
f0();
DST* pdst = (DST*)malloc(sizeof(DST)+1000);
if(pdst == 0){
return -1;
} memset(pdst, 0, sizeof(DST)+1000); pdst->ui = 0xffffffff;
pdst->i = pdst->ui;
pdst->j = -2147483648; pdst->li = -2147483648; pdst->c = -1;
pdst->uc = -1;
pdst->si = -1;
pdst->usi = -1; pdst->f = -1;
pdst->d = -1;
pdst->ld = -1; printf("pdst->c addr = %08x\n", &(pdst->c) );
printf("pdst->uc addr = %08x\n", &(pdst->uc) );
printf("pdst->si addr = %08x\n", &(pdst->si) );
printf("pdst->usi addr = %08x\n", &(pdst->usi) ); printf("pdst->f addr = %08x\n", &(pdst->f) );
printf("pdst->d addr = %08x\n", &(pdst->d) );
printf("pdst->ld addr = %08x\n", &(pdst->ld) ); free(pdst);
pdst = 0; return 0;
} void f0(void)
{
printf("in vs2010:\n");
printf("sizeof(char) = %d\n", sizeof(char));
printf("sizeof(int) = %d\n", sizeof(int));
printf("sizeof(short int) = %d\n", sizeof(short int));
printf("sizeof(long int) = %d\n", sizeof(long int)); printf("sizeof(float) = %d\n", sizeof(float)); printf("sizeof(double) = %d\n", sizeof(double));
printf("sizeof(long double) = %d\n", sizeof(long double)); }

  

内存中的i是0xffffffff,

(1)转化为二进制   1111 1111 1111 1111 1111 1111 1111 1111

(2)发现是负数

(3)减一               1111 1111 1111 1111 1111 1111 1111 1110

(4)除符号位取反   1000 0000 0000 0000 0000 0000 0000 0001 ; 真值为-1

内存中的j是0x80000000,(最小的一个负值,暂时还不能理解,因为借了一位才能完成这换算,需33位,不知是不是因为cpu中的计算单元有33位以上寄存器。)

(1)转化为2进制, 1000 0000 0000 0000 0000 0000 0000 0000

(2)发现是负数

(3)减一            1 0111 1111 1111 1111 1111 1111 1111 1111

(4)除符号位取反1 1000 0000 0000 0000 0000 0000 0000 0000 ;真值为-231= -2147483648

 

原码, 反码, 补码 详解张子秋的博客

c语言,内存字节对齐,oucaijun

【零基础学习iOS开发】【02-C语言】06-变量与内存M了个J

【零基础学习iOS开发】【02-C语言】07-基本数据类型M了个J

C语言,变量与内存的更多相关文章

  1. C语言变量声明内存分配

    转载: C语言变量声明内存分配   一个由c/C++编译的程序占用的内存分为以下几个部分 1.栈区(stack)— 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等.其操作方式类似于数据结 ...

  2. 关于c语言变量的内存分布测试程序

    #include <stdio.h> #include <stdlib.h> ; // 常全局变量 ; // 初始化全局变量 int uninit_global; // 未初始 ...

  3. [C语言 - 2] C语言变量

    A.变量的作用域: 1.局部变量:在函数或者代码块内部定义的变量 作用域:从定义处到代码块结束 生命周期:从定义处分配控件,代码块结束后被回收 局部变量没有默认值,要自己初始化   2.全局变量:在函 ...

  4. C语言中计算变量占用内存空间

    C语言中计算变量占用内存空间 在C语言中通常用[sizeof]运算符计算变量占内存空间,如下面的例子:

  5. C语言中的内存分配与释放

    C语言中的内存分配与释放 对C语言一直都是抱着学习的态度,很多都不懂,今天突然被问道C语言的内存分配问题,说了一些自己知道的,但感觉回答的并不完善,所以才有这篇笔记,总结一下C语言中内存分配的主要内容 ...

  6. JavaScript变量——栈内存or堆内存

    原文  http://blog.csdn.net/xdd19910505/article/details/41900693 堆和栈这两个字我们已经接触多很多次,那么具体是什么存在栈中什么存在堆中呢?就 ...

  7. C语言中的内存压缩技术

    C语言中的内存压缩技术 前言 在整个研究生阶段我都在参与一个LTE协议栈实现的项目,在这个项目中,我们利用一个自己编写的有限状态机框架将协议栈中每一层实现为一个内核模块.我们知道,在编写内核代码时需要 ...

  8. block没那么难(二):block和变量的内存管理

    本系列博文总结自<Pro Multithreading and Memory Management for iOS and OS X with ARC> 了解了 block的实现,我们接着 ...

  9. 黑马程序员-- C语言变量作用域与代码块

    这里通过变量作用域的两种错误用法来介绍一下C语言变量作用域 其次对代码块的使用进行了简单说明: #include <stdio.h> 1.变量的作用域(作用范围) 变量定义的那一行开始,直 ...

  10. C语言中的内存管理

    开始陆续的发一下唐老师视频的笔记吧,顺便带一些正冲哥书的的内容.不能一下都发出来,因为内容发多了自己也受不了,而且发的都是学习视频时候的一些笔记,可能会有一些问题不是很清晰. 先说一下C语言中的内存管 ...

随机推荐

  1. [LeetCode]题解(python):065-Valid Number

    题目来源: https://leetcode.com/problems/valid-number/ 题意分析: 输入一个字符串,判断这个字符串表示的是不是一个有效的数字.比如: "0&quo ...

  2. Linux(CentOS或RadHat)下MySQL源码安装

    安装环境: CentOS6.3 64位 软件: Mysql-5.6 所需包: gcc/g++ :MySQL 5.6开始,需要使用g++进行编译.cmake  :MySQL 5.5开始,使用cmake进 ...

  3. 【甘道夫】使用HIVE SQL实现推荐系统数据补全

    需求 在推荐系统场景中,假设基础行为数据太少,或者过于稀疏,通过推荐算法计算得出的推荐结果非常可能达不到要求的数量. 比方,希望针对每一个item或user推荐20个item,可是通过计算仅仅得到8个 ...

  4. iOS中的图像处理(三)——混合运算

    有时候,单独对一张图像进行处理是很难或者根本达不到我们想要的效果的.一个好的滤镜效果的诞生,往往要经过很多复杂步骤.细致微调.图片应用效果观察以及很多图层叠加. 我在JSWidget上发现了一些常用混 ...

  5. c 求两个整数的最大公约数和最小公倍数

    //求最大公约数是用辗转相除法,最小公倍数是根据公式 m,n 的 最大公约数* m,n最小公倍数 = m*n 来计算 #include<stdio.h> //将两个整数升序排列 void ...

  6. iOS原生App与H5页面交互笔记

    文/MikeZhangpy(简书作者)原文链接:http://www.jianshu.com/p/4ed3e5ed99c6著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 最近在做一个项 ...

  7. 【QT相关】Image Viewer Example

    结合QLable和QScrollArea显示一个图片. QLable典型用于用户展示文本,但是也能展示图片.QScrollArea提供了一个滚动视图,如果子控件超过了框架限制,QScrollArea自 ...

  8. C++静态成员函数和静态成员变量的探索

    静态数据成员属于类,非属于类对象,所以,定义位置就有了限制. 静态数据成员要实际地分配空间,故不能在类的声明中定义(只能声明数据成员).类声明只声明一个类的“尺寸和规格”,并不进行实际的内存分配,所以 ...

  9. Web Application的目录结构

    Java web工程下的webapp或WebContent就是工程的发布文件夹,发布时会把该文件夹发布到tomcat的webapps里. 一个web应用必须要有的目录文件如下: webapp/WebC ...

  10. redis(五)redis与Mybatis的无缝整合让MyBatis透明的管理缓存二

    在上一篇文中的Cahe类存在各种问题如:一直使用同一个连接,每次都创建新的Cache,项目中老是爆出connection timeout 的异常,存储的key过长等等一系列的问题,解决问题最好的办法就 ...