C++中int,Uint,uint16等有啥区别以及用处
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中int,Uint,uint16等有啥区别以及用处相关的知识,希望对你有一定的参考价值。
int是C/C++数据类型,uint,uint16,uint32并不是C/C++内建的类型,而只是一些typedef。可能的定义如下:typedef unsinged int uint;//为了省事啊,这样不用写unsigned int而只需要写uint
typedef unsigned short uint16;//int的size取决于平台,比如16位平台上sizeof(16)为2,32为上为4,64位上为8
// 而short的size则保证为2字节,在需要明确指明数据大小时可以使用
typedef unsigned long uint32;//道理同上,sizeof(long)一定为32,看看,在64位机上sizeof(long) <sizeof(int)” 参考技术A C++里面没有uint,只有int和unsigned int
int的取值范围是-21474 83647 到 21474 83648
unsigned int范围则是 0 到 21474 83647*2(两倍) 参考技术B
int32位的有符号整数,uint是32位无符号整数,uint16就是16位无符号整数
“int”和“uint”/“long”和“ulong”有啥区别?
【中文标题】“int”和“uint”/“long”和“ulong”有啥区别?【英文标题】:What is the difference between “int” and “uint” / “long” and “ulong”?“int”和“uint”/“long”和“ulong”有什么区别? 【发布时间】:2011-04-13 01:27:22 【问题描述】:我知道int
和long
(32 位和64 位数字),但uint
和ulong
是什么?
【问题讨论】:
【参考方案1】:uint
和 ulong
是 int
和 long
的未签名版本。这意味着它们不能是负面的。相反,它们具有更大的最大值。
要在源代码中编写文字 unsigned int,您可以使用后缀 u
或 U
,例如 123U
。
如果您希望成为CLS-Compliant,则不应在公共界面中使用 uint 和 ulong。
阅读文档了解更多信息:
int uint long ulong顺便说一句,还有short和ushort和byte和sbyte。
【讨论】:
这很有趣 - 你对 CLS 兼容是什么意思?该链接转到 int 的 MSDN 文档。如果“CLS”是指 C# 语言规范,那么我不明白 - 规范清楚地描述了 uint 和 ulong(第 1.3 节) @Isak Savo:如果您编写的接口可以被 C# 以外的其他 .NET 语言使用,那么符合 CLS 就很重要。 好奇你提到了 short 和 ushort 但忽略了 byte 和 sbyte :)【参考方案2】:以“u”为前缀的原始数据类型是具有相同位大小的无符号版本。实际上,这意味着它们不能存储负数,但另一方面,它们可以存储的正数是有符号数的两倍。签名的副本没有“u”前缀。
int(32 位)的限制是:
int: –2147483648 to 2147483647
uint: 0 to 4294967295
而对于长(64 位):
long: -9223372036854775808 to 9223372036854775807
ulong: 0 to 18446744073709551615
【讨论】:
这很有趣。 32 位有符号变量使用 1 位作为符号(正或负),因此可以存储 -2^31 和 +2^31 - 1 之间的值 比较int和uint的用法,哪一个可行? 什么是 c++ 等价物? @JacoPretorius 错了。 8 位 int 的范围从 –128 到 127。第 9 位表示 256。因此,使用 8 位您可以表示高达 255(第 9 个 val - 1)的所有值。从 -128 到 127 的范围的长度正好是 255。所以没有一个位可以持有该符号。高达 127 的所有值都是正数。上面的值显示为负数。 255 将是-1。 254 将是 -2,因此下降到 128。 我觉得还值得注意的是,专门针对 int vs uint,无符号整数不符合 CLS,建议尽可能多地使用 int。【参考方案3】:区别在于uint
和ulong
是无符号数据类型,意味着范围不同:它们不接受负值:
int range: -2,147,483,648 to 2,147,483,647
uint range: 0 to 4,294,967,295
long range: –9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
ulong range: 0 to 18,446,744,073,709,551,615
【讨论】:
【参考方案4】:u
表示unsigned
,所以ulong
是一个没有符号的大数。您可以在ulong
中存储比long
更大的值,但不允许使用负数。
long
值以 64 位存储,其第一个数字表示它是正数还是负数。而ulong
也是 64 位的,全部 64 位来存储数字。所以ulong的最大值是2(64)-1,而long是2(63)-1。
【讨论】:
【参考方案5】:自从我使用 C++ 以来已经有一段时间了,但这些答案有点不对劲。
就大小而言,'int' 什么都不是。它是标准整数的名义值;出于迭代之类的目的,假设它很快。它没有预设大小。
因此,关于 int 和 uint 之间差异的答案是正确的,但当他们谈论“它们有多大”或它们的范围是什么时,它们是不正确的。这个大小是未定义的,或者更准确地说,它会随着编译器和平台而改变。
在公共场合讨论你的比特大小是不礼貌的。
当你编译一个程序时,int 确实有一个大小,因为你已经把抽象的 C/C++ 变成了具体的机器代码。
所以,今天,实际上对于大多数常见的编译器来说,它们是正确的。但不要假设这一点。
具体来说:如果你正在编写一个 32 位的程序,int 将是一回事,64 位可以不同,而 16 位则不同。我已经浏览了所有三个并简要查看了 6502 颤抖
一个简短的谷歌搜索显示: https://www.tutorialspoint.com/cprogramming/c_data_types.htm 这也是很好的信息: https://docs.oracle.com/cd/E19620-01/805-3024/lp64-1/index.html
如果您真的不在乎您的位有多大,请使用 int;它可以改变。
如果您想知道某物有多大,请使用 size_t 和 ssize_t。
如果您正在读取或写入二进制数据,请不要使用 int。使用(通常取决于平台/源)特定关键字。 WinSDK 有很多很好的、可维护的例子。其他平台也可以。
我花了很多时间研究那些“SMH”的人的代码,认为这只是学术/迂腐。这些吃掉了编写不可维护代码的人。当然,使用 'int' 类型很容易,并且无需额外的输入即可使用它。要弄清楚它们的真正含义需要做很多工作,而且有点让人麻木。
当你混合 int 时,这是糟糕的编码。
当您只需要一个快速整数并且不关心范围(有符号/无符号除外)时,请使用 int 和 uint。
【讨论】:
以上是关于C++中int,Uint,uint16等有啥区别以及用处的主要内容,如果未能解决你的问题,请参考以下文章
“Uint32”、“int16”等;它们是标准的 C++ 吗?
Go 语言中的通用类型(int / uint)相对于特定类型(int64 / uint64)有啥优势?