精华内容
下载资源
问答
  • 为什么图上二进制存储形式和内存存储形式的第二个框中的数字不一样?另外就是他为啥是2个字节? ![图片说明](https://img-ask.csdn.net/upload/201512/27/1451177896_559885.png) 老师ppt上用100做的例子,内存...
  • 讲讲计算机中的存储形式: 计算机中存储的数都是以补码的方式存储的,而正数的原码,反码,补码都是一样的。但是负数的原码,反码,补码是不一样的。 下面都是以java中的int i=5为例。 正数5的原码就是其...

    今天,做个关于二进制的算法题,突然有个问题一直想不通为什么~5是6,计算机基础知识不过关啊,所以现在来弥补下,正数和负数在计算机中是怎么存储和计算的。

    讲讲计算机中的存储形式:

    计算机中存储的数都是以补码的方式存储的,而正数的原码,反码,补码都是一样的。但是负数的原码,反码,补码是不一样的。

     

     

    下面都是以java中的int i=5为例。

     

    正数5的原码就是其二进制码:00000000 00000000 00000000 00000101

                反码是:00000000 00000000 00000000 00000101

         补码是:00000000 00000000 00000000 00000101

    -5的原码是:10000000 00000000 00000000 00000101;

          反码是:11111111 11111111 11111111 11111010;//除符号位所有位取反

          补码是: 11111111 11111111 11111111 11111011;//反码加1

     

    那么java中~5是怎么计算的?

    ~5的补码:

      原码:00000000 00000000 00000000 00000101

          取反得补码:11111111 11111111 11111111 11111010

    求~5的原码:由上面的补码的反码:11111111 11111111 11111111 11111001

               取反得原码:10000000 00000000 00000000 00000110;//也就是-6

     

    计算机中的计算都是以补码的形式进行计算的:

    -5的补码是: 11111111 11111111 11111111 11111011

    1的补码是:00000000 00000000 00000000 00000001

    那么-5+1就是:

                         

          11111111 11111111 11111111 11111011
    +    00000000 00000000 00000000 00000001
           11111111 11111111 11111111 11111100                                                          

     

     

     

     

    11111111 11111111 11111111 11111100是计算机中的补码,减1转换为反码是:11111111 11111111 11111111 11111011,取反得原码是:10000000 00000000 00000000 00000100;

     

     

    补充一点:

    二进制的减法:

    0-0=1-1=0 
    1-0=1
    0-1=1(向高位借位)
      1 1 0 0 0 0 1 1  
    -  0 0 1 0 1 1 0 1
    -------------------
      1 0 0 1 0 1 1 0

    转载于:https://www.cnblogs.com/loren-Yang/p/7513895.html

    展开全文
  • 位操作  1#include  2 #include  3 int main()  4 {  5 int num;  6 int i;  7 printf("input:\n");  8 scanf("%d",&num);  9 printf("num=%d,&num=%p\n",num,&num);  10 int data=1 ... 1

    位操作

      1#include<stdio.h>

      2 #include<stdlib.h>
      3 int main()
      4 {
      5   int num;
      6   int i;
      7  printf("input:\n");
      8   scanf("%d",&num);
      9   printf("num=%d,&num=%p\n",num,&num);
     10   int data=1<<31;//构造一个相与的数据
     11   if(num<0)
     12    {
     13     num=~num+1;
     14     num=num|data;
     15     }
     16 
     17   for(i=1;i<=32;i++)
     18   {
     19      if((num&data)==0)
     20      {
     21       putchar('0');
     22       }
     23       else
     24       {
     25        putchar('1');
     26       }
     27      num<<=1;
     28 
     29   if(i%4==0)

     30   { 

              printf(" ");

            }

       }

    }


    展开全文
  • 二进制存储图片

    2019-07-16 20:19:37
    //这是个简单的小案例—用MySQL 数据库以二进制形式存储图片 我们数据库的类型应为:mediumblob 类型 原因:为了防止保存进去的图片超出存储的容量界线用mediumblob,它的最大存储量是16M; MySQL中,blob是一个...

    //这是个简单的小案例—用MySQL 数据库以二进制形式存储图片
    我们数据库的类型应为:mediumblob 类型
    原因:为了防止保存进去的图片超出存储的容量界线用mediumblob,它的最大存储量是16M;
    MySQL中,blob是一个二进制大型对象,是一个可以存储大量数据的容器,它能容纳不同大小的数据。blob类型实际是个类型系列(tinyblob、blob、mediumblob、longblob),除了在存储的最大信息量上不同外,他们是等同的。

    类型 大小(字节—最大)
    tinyblob 255
    blob 65K
    mediumblob 16M
    longblob 4G

    下面是案例的一个代码展示

    public class TestSaveImager {
        public static Connection con = null;
        public static PreparedStatement ps = null;
        public static ResultSet rs = null;
        public static void testSave(){
            try {
    //这是一个自定义的数据
                File file = new File("C:\\Users\\Administrator\\Downloads\\20190622063517.png");
                FileInputStream inputStream = new FileInputStream(file);
                con = DBUtil.getConnection();
                ps = con.prepareStatement("insert into student(userid,name,sex,age,imager) values(?,?,?,?,?)");
                ps.setInt(1,1);
                ps.setString(2,"哈喽");
                ps.setString(3,"女");
                ps.setString(4,"24");
    //存储时用流进行写入
            ps.setBinaryStream(5,inputStream,(int)file.length());
            ps.executeUpdate();
            inputStream.close();
             }catch (FileNotFoundException e){
             e.printStackTrace();
           }catch (IOException e){
             e.printStackTrace();
           }catch (SQLException e){
            e.printStackTrace();
        }
    }
        public static void main(String[] args) {
            readerJpg();
        }
    //读取二进制图片
    public static void readerJpg(){
        try {
            con = DBUtil.getConnection();
            String log = "SELECT name,sex,imager FROM student WHERE studentid = 9";
            File file = new File("C:\\Users\\Administrator\\Downloads\\桌面.jpg");
            if (file.exists()){
                try {
                    file.createNewFile();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
            try {
                byte[] Buffer = new byte[4095*5];
                ps = con.prepareStatement(log);
                rs = ps.executeQuery();
                while (rs.next()){
                    rs.getString("name");
                    rs.getString("sex");
                    FileOutputStream outputStream = new FileOutputStream(file);
                    InputStream inputStream = rs.getBinaryStream("imager");
                    int size = 0;
                    while ((size = inputStream.read(Buffer))!=-1){
                        System.out.println(size);
                        outputStream.write(Buffer,0,size);
                    }
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }catch (SQLException e){
            e.printStackTrace();
        }
    }
    
    展开全文
  • 图片以二进制形式存储到数据库中和显示 图片以二进制形式存储到数据库中和显示
  • 该信息以描述修改的“事件”的形式存储二进制日志有两个重要目的:对于复制,二进制日志在主复制服务器上用作要发送到从属服务器的语句的记录。 主服务器将其二进制日志中包含的事件发送到其从属服务器,这...

    c8a298b63de547175fb3effe8449d8eb.png

    参考官方文档:

    https://dev.mysql.com/doc/refman/5.7/en/stored-programs-logging.html

    二进制日志包含有关修改数据库内容的SQL语句的信息。 该信息以描述修改的“事件”的形式存储。 二进制日志有两个重要目的:

    • 对于复制,二进制日志在主复制服务器上用作要发送到从属服务器的语句的记录。 主服务器将其二进制日志中包含的事件发送到其从属服务器,这些服务器执行这些事件以对主服务器进行相同的数据更改。
    • 某些数据恢复操作需要使用二进制日志。 还原备份文件后,将重新执行备份后记录的二进制日志中的事件。 这些事件使数据库从备份更新到时间点。

    但是,如果在语句级别进行日志记录,则存储的程序(存储过程和函数,触发器和事件)存在某些二进制日志记录问题:

    • 在某些情况下,语句可能会影响主服务器和从服务器上的不同行集。
    • 在从属服务器上执行的复制语句由从属SQL线程处理(具有最高权限)。 程序可以在主服务器和从服务器上遵循不同的执行路径,因此用户可以编写包含危险语句的例程,该例程将仅在从服务器上执行,并由具有完全权限的线程处理。
    • 如果修改数据的存储程序是不确定的,则它不可重复。 这可能导致主站和从站上的数据不同,或导致还原的数据与原始数据不同。

    通常,当SQL语句级别(基于语句的二进制日志记录)发生二进制日志记录时,会导致此处描述的问题。 如果使用基于行的二进制日志记录,则日志包含由于执行SQL语句而对各个行所做的更改。 执行例程或触发器时,将记录行更改,而不是进行更改的语句。 对于存储过程,这意味着不记录CALL语句。 对于存储的函数,将记录函数内的行更改,而不是函数调用。 对于触发器,将记录触发器所做的行更改。 在slave端,只能看到行更改,而不是存储的程序调用。

    混合格式二进制日志记录(binlog_format = MIXED)使用基于语句的二进制日志记录,除了一些基于行的二进制日志记录才能够产生正确结果的情况除外。 对于混合格式,当存储的函数,存储过程,触发器,事件或预准备语句包含对基于语句的二进制日志记录不安全的任何内容时,整个语句将标记为不安全并以行格式记录。 用于创建和删除过程,函数,触发器和事件的语句始终是安全的,并以语句格式记录。

    在MySQL中使用存储函数的条件可以总结如下。 这些条件不适用于存储过程或事件调度,除非启用了二进制日志记录,否则它们不适用。

    • 要创建或更改存储的函数,除了通常需要的CREATE ROUTINE或ALTER ROUTINE权限外,还必须具有SUPER权限。 (根据函数定义中的DEFINER值,无论是否启用二进制日志记录,都可能需要SUPER。
    • 创建存储函数时,必须声明它是确定性的或不修改数据。 否则,数据恢复或复制可能不安全。

    默认情况下,要接受CREATE FUNCTION语句,必须至少明确指定DETERMINISTIC,NO SQL或READS SQL DATA中的一个。 否则会发生错误:

    ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable

    此函数是确定性的(并不会修改数据),因此它是安全的:

    CREATE FUNCTION f1(i INT)

    RETURNS INT

    DETERMINISTIC

    READS SQL DATA

    BEGIN RETURN i;

    END;

    此函数使用UUID(),这不是确定性的,因此该函数也不是确定性的并且不安全:

    CREATE FUNCTION f2()

    RETURNS CHAR(36)

    CHARACTER SET utf8 BEGIN RETURN UUID();

    END;

    这个函数 修改数据,所以其也不安全

    CREATE FUNCTION f3(p_id INT)

    RETURNS INT

    BEGIN

    UPDATE t SET modtime = NOW() WHERE id = p_id;

    RETURN ROW_COUNT();

    END;

    评估函数的性质是基于创建者的诚实性。 MySQL不会检查声明为DETERMINISTIC的函数去检查是否没有产生非确定性结果的语句。

    • 当您尝试执行存储函数时,如果设置了binlog_format = STATEMENT,则必须在函数定义中指定DETERMINISTIC关键字。 如果不是这种情况,则会生成错误并且函数不会运行,除非指定log_bin_trust_function_creators = 1来覆盖此检查(请参见下文)。 对于递归函数调用,仅在最外层调用时需要DETERMINISTIC关键字。 如果正在使用基于行或混合二进制日志记录,则即使在没有DETERMINISTIC关键字的情况下定义函数,也会接受并复制该语句。
    • 因为MySQL在创建时不检查函数是否确实是确定性的,所以使用DETERMINISTIC关键字调用存储函数可能会对基于语句的日志格式执行不安全的操作,或者调用包含不安全语句的函数或过程。 如果在设置binlog_format = STATEMENT时发生这种情况,则会发出警告消息。 如果正在使用基于行或混合二进制日志记录,则不会发出警告,并且将以基于行的格式复制语句。
    • 要放松函数创建的前置条件(必须具有SUPER权限并且必须将函数声明为确定性或不修改数据),请将全局log_bin_trust_function_creators系统变量设置为1.默认情况下,此变量的值为0 ,但你可以改变它:

    mysql> SET GLOBAL log_bin_trust_function_creators = 1;

    您还可以在启动服务器时使用--log-bin-trust-function-creators = 1选项设置此变量。

    如果未启用二进制日志记录,则log_bin_trust_function_creators不适用。 创建函数不需要SUPER,除非如前所述,函数定义中的DEFINER值需要它。

    • 有关可能对复制不安全的内置函数的信息(因此导致使用它们的存储函数也不安全)

    触发器与存储函数类似,因此前面关于函数的注释也适用于触发器除了:CREATE TRIGGER没有可选的DETERMINISTIC特性,因此假设触发器始终是确定性的。 但是,在某些情况下,这种假设可能无效。 例如,UUID()函数是不确定的(并且不会复制)。 在触发器中使用此类功能时要小心。

    触发器可以更新表,因此如果您没有所需的权限,则CREATE TRIGGER会出现类似于存储函数的错误消息。 在从属端,slave使用触发器DEFINER属性来确定哪个用户被认为是触发器的创建者。

    无论日志记录模式如何,CREATE和DROP语句都将记录为语句。

    下面的内容是基于 语句日志记录的,不是基于行的日志

    • 服务器将CREATE EVENT,CREATE PROCEDURE,CREATE FUNCTION,ALTER EVENT,ALTER PROCEDURE,ALTER FUNCTION,DROP EVENT,DROP PROCEDURE和DROP FUNCTION语句写入二进制日志。
    • 如果函数更改数据并且在不会记录的语句中发生,则存储的函数调用SELECT语句记录。 这可以防止因在非记录语句中使用存储函数而导致的数据更改不重复。 例如,SELECT语句不会写入二进制日志,但SELECT可能会调用存储的函数进行更改。 要处理此问题,当给定函数进行更改时,SELECT func_name()语句将写入二进制日志。 假设在master上执行以下语句:

    CREATE FUNCTION f1(a INT) RETURNS INT BEGIN

    IF (a < 3)

    THEN INSERT INTO t2 VALUES (a);

    END IF;

    RETURN 0;

    END;

    CREATE TABLE t1 (a INT);

    INSERT INTO t1 VALUES (1),(2),(3);

    SELECT f1(a) FROM t1;

    当SELECT语句执行时,函数f1()被调用三次。 其中两个调用插入一行,MySQL为每个调用记录一个SELECT语句。 也就是说,MySQL将以下语句写入二进制日志:

    SELECT f1(1);

    SELECT f1(2);

    • 当函数调用的存储过程导致错误的,服务器还会为存储的函数调用记录SELECT语句。 在这种情况下,服务器将SELECT语句与预期的错误代码一起写入日志。 在从属设备上,如果发生相同的错误,那就是预期的结果并继续复制。 否则,复制将停止
      • 函数可以遵循主服务器和从服务器上的不同执行路径。
      • 在从属服务器上执行的语句由具有完全权限的从属SQL线程处理。

    这意味着虽然用户必须具有CREATE ROUTINE权限才能创建一个函数,但用户可以编写一个包含危险语句的函数,该函数仅在从服务器上执行,并由具有完全权限的线程处理。 例如,如果主服务器和从属服务器的服务器ID值分别为1和2,则主服务器上的用户可以创建并调用unsafe函数unsafe_func(),如下所示:

    mysql> delimiter //

    mysql> CREATE FUNCTION unsafe_func () RETURNS INT

    -> BEGIN

    -> IF @@server_id=2 THEN dangerous_statement; END IF;

    -> RETURN 1;

    -> END;

    -> //

    mysql> delimiter ;

    mysql> INSERT INTO t VALUES(unsafe_func());

    CREATE FUNCTION和INSERT语句被写入二进制日志,因此从服务器将执行它们。 因为从属SQL线程具有完全权限,所以它将执行危险语句。 因此,函数调用对主服务器和从服务器具有不同的影响,并且不是复制安全的。

    为了防止启用二进制日志记录的服务器出现这种危险,除了通常需要的CREATE ROUTINE权限外,存储的函数创建者还必须具有SUPER权限。 同样,要使用ALTER FUNCTION,除了ALTER ROUTINE权限外,还必须具有SUPER权限。 如果没有SUPER权限,将发生错误:

    ERROR 1419 (HY000):

    You do not have the SUPER privilege and binary logging is enabled

    (you *might* want to use the less safe log_bin_trust_function_creators variable)

    如果您不希望要求函数创建者具有SUPER权限(例如,如果您的系统上具有CREATE ROUTINE权限的所有用户都是有经验的应用程序开发人员),请将全局log_bin_trust_function_creators系统变量设置为1.您还可以启动服务器时使用--log-bin-trust-function-creators = 1选项设置此变量。 如果未启用二进制日志记录,则log_bin_trust_function_creators不适用。 创建函数不需要SUPER,除非如前所述,函数定义中的DEFINER值需要它。

    • 要记录的语句可能包含对用户定义变量的引用。 为了解决这个问题,MySQL将一个SET语句写入二进制日志,以确保该变量存在于从站上,其值与主站上的值相同。 例如,如果语句引用变量@my_var,则该语句将在二进制日志的开头,其中value是master上@my_var的值:

    SET @my_var = value;

    • 存储过程调用可以在已提交或回滚的事务中进行。 也就是说,服务器在实际执行和修改数据的过程中记录这些语句,并根据需要记录BEGIN,COMMIT和ROLLBACK语句。 例如,如果过程仅更新事务表并在回滚的事务中执行,则不会记录这些更新。 如果过程在已提交的事务中发生,则会记录BEGIN和COMMIT语句以及更新。 对于在回滚事务中执行的存储过程,如果语句以独立方式执行,则使用相同的规则记录其语句:
      • 不记录事务表的更新。
      • 将记录对非事务表的更新,因为回滚不会取消它们。
      • 记录事务和非事务表混合的更新,包括BEGIN和ROLLBACK,以便从服务器进行与主服务器相同的更改和回滚。
    • 如果从存储函数中调用过程,则不会在语句级别将存储过程调用写入二进制日志。 在这种情况下,唯一记录的是调用函数的语句(如果它发生在记录的语句中)或DO语句(如果它发生在未记录的语句中)。 因此,在使用调用过程的存储函数时应该小心,即使该过程本身是安全的。
    展开全文
  • 如何将图片以二进制形式存入数据库中 在二进制形式读取出来 求代码
  • 数据在内存中的存储二进制形式存储) 计算机要处理的信息是多种多样的,如数字、文字、符号、图形、音频、视频等,这些信息在人们的眼里是不同的。但对于计算机来说,它们在内存中都是一样的,都是以二进制形式...
  • 二进制存储 数字在计算机当中是以二进制的形式来进行存储的。 比如说,我们都知道,int型的取值范围为-2147483648到+2147483647,即 -231~(231-1),为什么呢?这是因为,计算机中规定int型的存储空间为4个字节,也...
  • 内存中的二进制存储

    2015-02-26 22:03:38
    内存中的二进制存储 数值是以补码表示的: • 正数的补码和原码相同; • 负数的补码:将该数的绝对值的二进 制形式按位取反再加1。 • 例如:求-10的补码 10的原码:...
  • float浮点数的二进制存储方式及转换

    万次阅读 2014-11-06 09:21:42
    float浮点数的二进制存储方式及转换 int和float都是4字节32位表示形式。为什 float浮点数的二进制存储方式及转换 int和float都是4字节32位表示形式。为什么float的范围大于int? float精度为6~7位。1.66*10^10...
  • 文件上传这个我看来有两种上传方法:一、上传到服务器上把文件地址存入数据库中 、直接把文件以字节数存储 第一种方式比较常见:可以使用文件流的形式把文件写入到服务器端。 今天主要说明第种方法: 因为我...
  • 我们知道,计算机中任何整数都是以二进制补码的形式存储,下面的程序用来计算整数在存储时,二进制中1的个数。 (以下代码以32位系统为例) 第一种方法 #include &lt;stdio.h&gt; int main() { int num = 7...
  • 下面这段代码将负数转化为它在计算机中的存储形式,操作平台为VS。 注意:用int类型的负数是有范围的,int类型能表示的负数为:-2^31~1 但是在这段代码中,为了扩大范围,我们直接输入该负数的绝对值,将它声明为...
  • 如果以二进制形式直接将文件或者图片上传到数据库中,那么读取的时候也是通过数据库的byte[]数组读取。首先数据库存储的字段要设置为blob。 上传不在介绍,就是以byte数组去存储。读取的时候: @...
  • BinaryImage:直接显示以二进制形式存储在数据库中的图片 对于以二进制形式存储在数据库中的图片,以前都是采用在单独的aspx页面Response.BinaryWrite写出、Image控件设置ImageUrl属性调用的方法来显示,...
  • 大部分数据的二进制形式都可以用科学计数法表示,即1.m*2^n这种形式,只要知道m和n,就能确定一个数值,float中指数位记载的就是n,数值位记载的就是m. 简单示例: 我们先来个简单的例子:4.5f是怎么存储的? 1. 我们...
  • Redis以二进制形式存储对象

    千次阅读 2020-01-15 17:01:34
    代码已测试 直接测试就可以 ,注意 实体类一定要 实现 Serializable 接口 不然会报错 import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component;...
  • 零基础入门学习Python(15):二进制存储 pickle 和异常处理pickle几乎可以把所有Python的对象转换为二进制的形式存储 使用pickle时,需要导入pickle模块>>> import pickle #导入pickle模块 >>> myList = [1,2,3,'...
  • ①前端url传给服务器图片id,根据id查找对应图片的二进制数据 ②图片实体类用byte[]接收图片二进制数据 ③repsonse设置浏览器响应设置 ④response.getWriter() 用于处理字符流数据 ⑤response.getOutputStream...
  • 如何将图片转换成二进制存储

    热门讨论 2009-12-24 14:30:11
    存储图片:以二进制形式存储图片时,要把数据库中的字段设置为Image数据类型(SQL Server),存储的数据是Byte[]. 1.参数是图片路径:返回Byte[]类型: public byte[] GetPictureData(string imagepath) { /**/////...
  • 32位系统sizeof(int)=4,也就是有32位二进制数,内存中是以32位二进制补码的形式存放这个数的,int为有符号数,最前面一个数字是符号位,0表示正数,1表示负数。 也就是31位存储这个数的大小。 正数的补码就是他的...
  • 本文以实例形式讲述了ASP.NET实现图片以二进制形式存入数据库的方法。过去我们都是直接在数据库中存入图片文件名的,还没有试过存储整张图片到数据库中,经过一番资料查询与测试,整理出了如下的功能代码: 1.建立...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 6,221
精华内容 2,488
关键字:

二进制存储形式