无符号整型和有符号整形转换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无符号整型和有符号整形转换相关的知识,希望对你有一定的参考价值。

5.以下语句的输出结果是()
printf("%d,%d,%u\n",016,16,-16);
主要是第三个的值解释请一下

main()
unsigned int a=42486;
printf("a=%d,%o,%x,%u\n",a,a,a,a);
请主要解释一下第一个

谢谢

这个转化主要是看内存中的存储形式,一般是直接转化。。。。。-16在内存中的补码是1111111111110000 换成无符号数 就是65520
另外你记住65535+1 =0 ; -16=0+(-16) =
65535+1-16=65520;
42486=1010010111110110 你可以这么计算。。。有符号数范围 32767— -32768 42486=9719+32767 =9718+(1+32767)=9718+(-32768)= -23050
参考技术A 5.以下语句的输出结果是()
printf("%d,%d,%u\n",016,16,-16);

14,16,4294967280 或 14,16,65520

-16的实际32位二进制是1111 1111 1111 1111 1111 1111 1111 0000
对于unsigned来说,就是4294967280.
但如果是16位的话,就是1111 1111 1111 0000
对于unsigned来说,就是65520.

答案取决于编译器.

-------------

main()
unsigned int a=42486;
printf("a=%d,%o,%x,%u\n",a,a,a,a);
请主要解释一下第一个

如果是16位的话, 42486就是1010 0101 1111 0110
对于signed来说, 就是-23050.

Golang 入门 : 整型

整型介绍

Go语言同时提供了有符号和无符号类型的整数运算。这里有 int8int16int32int64 四种截然不同大小的有符号整形数类型,分别对应 8、16、32、64 bit大小的有符号整形数,与此对应的是 uint8uint16uint32uint64 四种无符号整形数类型。

数据类型 说明 取值范围
有符号整数
int8 有符号 8位整数 -128到 127
int16 有符号 16位整数 -32768 到32767
int32 有符号 32位整数 -2147483648到2147483647
int64 有符号 64位整数 -9223372036854775808到9223372036854775807
无符号整数
uint8 无符号8位整数 0到255
uint16 无符号16位整数 0到65535
uint32 无符号32位整数 0到4294967295
uint64 无符号64位整数 0到18446744073709551615

u 开头的整数类型称为无符号整数类型。 无符号整数类型的值都是非负的。 一个数值类型名称中的数字表示每个这个类型的值将在内存中占有多少二进制位(以后简称位)。二进制位常称为比特(bit)。 比如,一个 uint8 的值将占有8位。 我们称 uint8 类型的值的尺寸是8位。 因此,最大的 uint8 值是 255(2^8 - 1 ), 最大的 int8 值是 127(2^7 - 1 ), 最小的 int8 值是 -128(-2^7)。

int8uint8 举例,8 代表 8个bit,能表示的数值个数有 2^8 = 256。

uint8 是无符号,能表示的都是正数,0-255,刚好256个数。

int8 是有符号,既可以正数,也可以负数,那怎么办?对半分呗,-128 ~ 127,也刚好 256个数。

int8int16int32int64 这几个类型的最后都有一个数值,这表明了它们能表示的数值个数是固定的。

类型别名

Go中有两种内置类型别名(type alias):

  • byteuint8 的内置别名。 我们可以将 byteuint8 看作是同一个类型。
  • runeint32 的内置别名。 我们可以将 runeint32 看作是同一个类型。

但是 intint64 不是同一种类型。

int 没有并没有指定它的位数,说明它的大小,是可以变化的

  • 当你在32位的系统下,intuint 都占用 4个字节,也就是32位。

  • 若你在64位的系统下,intuint 都占用 8个字节,也就是64位。

出于这个原因,在某些场景下,你应当避免使用 intuint ,而使用更加精确的 int32int64,比如在二进制传输、读写文件的结构描述(为了保持文件的结构不会受到不同编译目标平台字节长度的影响)

这里的有符号和无符号整数 intuint,一般对应特定的CPU平台机器字大小。int 在32位系统中是4字节,在64位系统中是8字节,但是我们不能对此做任何的假设;因为不同的编译器即使在相同的硬件平台上可能产生不同的大小。

数值类型的零值都是零(但是不同类型的零在内存中占用的空间可能不同)。

关于 int 类型的取值范围,如果要把一个大的数字,放进小的数据类型则会放不进去。

var n int8
n=100
fmt.Println(n)     //100 没有问题
//如果赋值为200 则不行 因为int8取值范围最大是127

var i2 uint8
i2=200
fmt.Println(i2) //200  uint8 取值范围最大是0到255

整数类型字面量

一个值的字面形式称为一个字面量,它表示此值在代码中文字体现形式(和内存中的表现形式相对应)。一个值可能会有很多种字面量形式。

整数类型值有四种字面量形式:十进制形式(decimal)、八进制形式(octal)、十六进制形式(hex)和二进制形式(binary)。 比如,下面的三个字面量均表示十进制的15:

0xF // 十六进制表示(必须使用0x或者0X开头)
0XF

017 // 八进制表示(必须使用0、0o或者0O开头)
0o17
0O17

0b1111 // 二进制表示(必须使用0b或者0B开头)
0B1111

15  // 十进制表示(必须不能用0开头)

(注意:二进制形式和以0o或0O开头的八进制形式从Go 1.13开始才支持。)

下面用一段代码分别使用二进制、八进制、十六进制来表示十进制的数值:12

package main

import (
    "fmt"
)

func main() {
    var num01 int = 0b1100
    var num02 int = 0o14
    var num03 int = 0xC

    fmt.Printf("2进制数 %b 表示的是: %d \\n", num01, num01)
    fmt.Printf("8进制数 %o 表示的是: %d \\n", num02, num02)
    fmt.Printf("16进制数 %X 表示的是: %d \\n", num03, num03)
}

输出

2进制数 1100 表示的是: 12 
8进制数 14 表示的是: 12 
16进制数 C 表示的是: 12 

以上代码用过了 fmt 包的格式化功能

%b    表示为二进制
%c    该值对应的unicode码值
%d    表示为十进制
%o    表示为八进制
%q    该值对应的单引号括起来的go语法字符字面值,必要时会采用安全的转义表示
%x    表示为十六进制,使用a-f
%X    表示为十六进制,使用A-F
%U    表示为Unicode格式:U+1234,等价于"U+%04X"

基本数值类型字面量的适用范围

一个数值型的字面量只有在不需要舍入时,才能用来表示一个整数基本类型的值。 比如,1.0 可以表示任何基本整数类型的值,但 1.01 却不可以。 当一个数值型的字面量用来表示一个非整数基本类型的值时,舍入(或者精度丢失)是允许的。

每种数值类型有一个能够表示的数值范围。 如果一个字面量超出了一个类型能够表示的数值范围(溢出),则在编译时刻,此字面量不能用来表示此类型的值。
下表是一些例子:

字面表示 此字面表示可以表示哪些类型的值(在编译时刻)
256 除了int8和uint8类型外的所有的基本数值类型。
255 除了int8类型外的所有的基本数值类型。
-123 除了无符号整数类型外的所有的基本数值类型。
123 所有的基本数值类型。
123.000 所有的基本数值类型。
1.23e2 所有的基本数值类型。
\'a\' 所有的基本数值类型。
1.0+0i 所有的基本数值类型。
1.23 所有浮点数和复数基本数值类型。
0x10000000000000000 (16 zeros) 所有浮点数和复数基本数值类型。
3.5e38 除了float32和complex64类型外的所有浮点数和复数基本数值类型。
1+2i 所有复数基本数值类型。
2e+308 无。

注意几个溢出的例子:

  • 字面量 0x10000000000000000 需要65个比特才能表示,所以在运行时刻,任何基本整数类型都不能精确表示此字面量。
  • 在IEEE-754标准中,最大的可以精确表示的 float32 类型数值为 3.40282346638528859811704183484516925440e+38,所以 3.5e38 不能表示任何 float32complex64 类型的值。
  • 在IEEE-754标准中,最大的可以精确表示的 float64 类型数值为 1.797693134862315708145274237317043567981e+308,因此 2e+308 不能表示任何基本数值类型的值。
  • 尽管 0x10000000000000000 可以用来表示 float32 类型的值,但是它不能被任何 float32 类型的值所精确表示。上面已经提到了,当使用字面量来表示非整数基本数值类型的时候,精度丢失是允许的(但溢出是不允许的)。

以上是关于无符号整型和有符号整形转换的主要内容,如果未能解决你的问题,请参考以下文章

uint是几位无符号整数?

uint是几位的整型啊,uint16是几位的?

uint8和uint16 是啥数据类型?

C语言里怎样理解长整型 短整型 和无符号型变量和常量?

怎样用c将无符号整型转化为字符型

c中无符号(unsigned)和有符号(signed)两种类型。