learn_C_deep_5 (温故知新、sigend char a = -128的深度理解、unsigned int类型的写法规范)

简介: learn_C_deep_5 (温故知新、sigend char a = -128的深度理解、unsigned int类型的写法规范)

温故知新


理解"unsigned int a = -10;"


继上章之后,我们首先来复习一下"unsigned int a = -10;"的知识。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
  unsigned int a = -10;//编译无错误
  //-10转为二进制
  //原码:1000 0000 0000 0000 0000 0000 0000 1010
  //反码:1111 1111 1111 1111 1111 1111 1111 0101
  //补码:1111 1111 1111 1111 1111 1111 1111 0110
  //将二进制序列1111 1111 1111 1111 1111 1111 1111 0110 - 存到空间
  //再看类型为无符号整形,不看符号位,直接补码就是原码
  //1111 1111 1111 1111 1111 1111 1111 0110 - 4294967286
  printf("%u\n", a);//4294967286
  unsigned char b = -10;
  //将二进制序列1111 1111 1111 1111 1111 1111 1111 0110 - 存到空间
  //再看类型unsigned char
  //发生截断
  //1111 0110
  //再看类型为无符号char类型, 不看符号位, 直接补码就是原码
  //1111 0110 - 246
  printf("%u", b);
  return 0;
}


再来复习一下大小端的知识


如何理解大小端


可以通过模拟内存中存放二进制数的方式来理解大小端。假设我们要在内存中存储一个16位的二进制数0x1234,即十进制的4660。在大端字节序中,将最高位的字节存放在了最低的内存地址中,最低位的字节存放在最高的地址中,因此,在内存中,该二进制数的存储方式如下:


```

地址  内容

0x00  0x12

0x01  0x34

```

可以看到,0x12存放在了最低的地址0x00中,0x34存放在了最高的地址0x01中。而在小端字节序中,将最低位的字节存放在了最低的内存地址中,最高位的字节存放在最高的地址中,因此,在内存中,该二进制数的存储方式如下:


```

地址  内容

0x00  0x34

0x01  0x12

```

可以看到,0x34存放在了最低的地址0x00中,0x12存放在了最高的地址0x01中。


因此,可以理解为,大小端字节序是指在内存中存放二进制数时,每个字节的存放顺序不同。在大端字节序中,高位字节在前,低位字节在后;而在小端字节序中,低位字节在前,高位字节在后。这两种字节序会对数据的存储和传输产生影响,因此在不同的硬件和软件平台上需要注意字节序的问题。


大小端的概念


大端字节序(Big Endian)即高位字节优先,它将最高位的字节存放在最低的内存地址中,最低位的字节存放在最高的地址中,这和我们读数字的顺序一致,即最高位在最左侧,最低位在最右侧。


小端字节序(Little Endian)即低位字节优先,它将最低位的字节存放在最低的内存地址中,最高位的字节存放在最高的地址中,这和我们习惯的书写顺序一致,即从左向右依次写数字。


大小端是如何影响数据存储的



sigend char a = -128的深度理解


10000000为什么是-128,而不是-0


 在使用补码表示法时,10000000表示的是负数,而不是-0。这是因为在补码表示法中,正数的二进制表示与原码表示相同,负数的二进制表示则为其绝对值的原码取反再加1。因此,10000000的补码为11111111(取反)+ 1=10000000,表示的是-128,而不是-0。在补码表示法中,-0没有意义,并且不存在对应的二进制表示。因为0的原码、反码和补码都是00000000,而且补码中没有正零和负零之分。因此,在补码表示法中,所有二进制表示的最高位(符号位)为1的二进制数都表示负数,而不表示-0。

代码练习


接下来我们看几个代码,看看我们是否掌握了上面的知识。


#include<stdio.h>

int main()

{

   char a[1000];

   int i = 0;

   for (i = 0; i < 1000; i++)

   {

       a[i] = -1 - i;

   }

   printf("%d", strlen(a));

   return 0;

}


这个图能更方便我们了解char数据类型的取值,它是一个圈 (-1) -> (-128)  -> 127 -> 0 -> (-1).


#include<stdio.h>

int main()

{

  int i = -20;

   unsigned int j = 10;

   printf("%d\n", i + j);

   printf("%u\n", i + j);

   return 0;

}


#include<stdio.h>

#include<windows.h>

int main()

{

   unsigned int i = 0;

   //死循环

   for (i = 9; i >= 0; i--)

   {

       printf("%u\n", i);

       Sleep(1000);//休眠一秒

   }

   return 0;

}

现在自己试着画图解释一下这个代码哟!

#include<stdio.h>

#include<windows.h>

int main()

{

   unsigned int i = 0;

   //死循环

   for (i = 0; i >= 0; i++)

   {

       printf("%u\n", i);

       Sleep(1000);//休眠一秒

   }

   return 0;

}


答案在后面。


unsigned int类型的写法规范


       使用unsigne int类型时,建议初始化的时候,在数值后面加’u‘


例如:


 unsigned int a = 10u;


       因为如果unsigned int a = -10;编译器是不会报错的,但是这样unsigned int a = -10u;就会报错:error C4146 : 一元负运算符应用于无符号类型,结果仍为无符号类型,

目录
打赏
0
0
0
0
11
分享
相关文章
[oeasy]python077_int类型怎么用_整数运算_integer_进制转化_int类
本文主要讲解了Python中`int`类型的应用与特性。首先回顾了`int`词根的溯源,探讨了整型变量的概念及命名规则(如匈牙利命名法)。接着分析了整型变量在内存中的存储位置和地址,并通过`type()`和`id()`函数验证其类型和地址。还介绍了整型变量的运算功能,以及如何通过`int()`函数将字符串转化为整数,支持不同进制间的转换(如二进制转十进制)。此外,文章提及了关键字`del`的使用场景,对比了Python与C语言中`int`的区别,并总结了整型与字符串类型的差异,为后续深入学习奠定基础。
38 1
|
27天前
|
[oeasy]python076_int这个词怎么来的_[词根溯源]整数类型_int_integer_touch
本文探讨了“int”一词的起源及其与整数类型的关联。通过词根溯源,揭示“int”来源于“integer”,意为“完整的数”,与零碎的分数相对。同时分析了相关词汇如“tact”(接触)、“touch”(触摸)及衍生词,如“tangential”(切线的)、“intagible”(无形的)和“integral”(完整的、不可或缺的)。文章还结合编程语言特性,解释了Python作为动态类型、强类型语言的特点,并总结了整型变量的概念与意义。最后预告了后续内容,提供了学习资源链接。
56 11
【YashanDB知识库】MySQL迁移至崖山char类型数据自动补空格问题
**简介**:在MySQL迁移到崖山环境时,若字段类型为char(2),而应用存储的数据仅为&#39;0&#39;或&#39;1&#39;,查询时崖山会自动补空格。原因是mysql的sql_mode可能启用了PAD_CHAR_TO_FULL_LENGTH模式,导致保留CHAR类型尾随空格。解决方法是与应用确认数据需求,可将崖山环境中的char类型改为varchar类型以规避补空格问题,适用于所有版本。
【YashanDB 知识库】MySQL 迁移至崖山 char 类型数据自动补空格问题
问题分类】功能使用 【关键字】char,char(1) 【问题描述】MySQL 迁移至崖山环境,字段类型源端和目标端都为 char(2),但应用存储的数据为'0'、'1',此时崖山查询该表字段时会自动补充空格 【问题原因分析】mysql 有 sql_mode 控制,检查是否启用了 PAD_CHAR_TO_FULL_LENGTH SQL 模式。如果启用了这个模式,MySQL 才会保留 CHAR 类型字段的尾随空格,默认没有启动。 #查看sql_mode mysql> SHOW VARIABLES LIKE 'sql_mode'; 【解决/规避方法】与应用确认存储的数据,正确定义数据
|
6月前
|
使用 sizeof 操作符计算int, float, double 和 char四种变量字节大小
【10月更文挑战第13天】使用 sizeof 操作符计算int, float, double 和 char四种变量字节大小。
193 1
SQL判断CHAR类型字段不为空的方法与技巧
在SQL查询中,判断一个CHAR类型字段是否不为空是一个常见的需求
|
6月前
|
[oeasy]python036_数据类型有什么用_type_类型_int_str_查看帮助
本文回顾了Python中`ord()`和`chr()`函数的使用方法,强调了这两个函数互为逆运算:`ord()`通过字符找到对应的序号,`chr()`则通过序号找到对应的字符。文章详细解释了函数参数类型的重要性,即`ord()`需要字符串类型参数,而`chr()`需要整数类型参数。若参数类型错误,则会引发`TypeError`。此外,还介绍了如何使用`type()`函数查询参数类型,并通过示例展示了如何正确使用`ord()`和`chr()`进行转换。最后,强调了在函数调用时正确传递参数类型的重要性。
61 3
|
7月前
|
java基础(9)数据类型中的char类型以及涉及到的转义字符
Java中的char类型可以存储一个中文字符,因为它占用两个字节。转义字符允许在代码中使用特殊字符,例如`\n`表示换行,`\t`表示制表符,`\\`表示反斜杠,`\'`表示单引号,`\"`表示双引号。可以使用`\u`后跟Unicode编码来表示特定的字符。
154 2
java基础(9)数据类型中的char类型以及涉及到的转义字符
【Java基础面试五】、 int类型的数据范围是多少?
这篇文章回答了Java中`int`类型数据的范围是-2^31到2^31-1,并提供了其他基本数据类型的内存占用和数值范围信息。
【Java基础面试五】、 int类型的数据范围是多少?

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等