混淆sizeof运算符结果

时间:2017-06-23 22:02:50

标签: c++ sizeof

我对结果的大小有点困惑。

我有这个:

unsigned  long part1 = 0x0200000001;
cout << sizeof(part1); // this gives 8 byte

如果我算的正确,第1部分是9字节长吗?

任何人都可以为我澄清这个

感谢 此致

5 个答案:

答案 0 :(得分:0)

  

如果我算的正确,第1部分是9字节长吗?

不,你数不正确。 0x0200000001可以容纳五个字节。一个字节由两个十六进制数字表示。因此,字节为02 00 00 00 01

答案 1 :(得分:0)

我想你误解了sizeof(type)的含义。 sizeof(int)返回系统保留的字节数相应类型的任何值。因此,32位系统上的4可能会在64位系统上提供8字节和sizeof(char[20])字节,20会提供int x; sizeof(x),依此类推。 注意,也可以使用(类型)变量的标识符,例如type;然后从变量声明/定义推导出sizeof(x),以便在这种情况下sizeof(int)sizeof相同。

但是:sizeof永远不会在运行时解释或分析变量的内容/值,即使char *x = "Hello, world"; sizeof(x)听起来好像也是如此。因此,"Hello, world" 字符串文字char*的字符串长度,但类型sizeof(part1)的大小。

因此,sizeof(long)8相同,无论part1的实际内容在运行时是什么,系统if ( $_POST['columns'][$i]['data'] != 'TimeOccurred.date.' ) { if ( $sWhere == "" ) { $sWhere = "WHERE "; } else { $sWhere .= " AND "; } $sWhere .= $aColumns[$i]." LIKE '%".addslashes($_POST['columns'][$i]['search']['value'])."%' "; } 都是 let activityItem = URL.init(fileURLWithPath: Bundle.main.path(forResource: "fileName", ofType: "mp3")!) let activityVC = UIActivityViewController(activityItems: [activityItem],applicationActivities: nil) activityVC.popoverPresentationController?.sourceView = self.view self.present(activityVC, animated: true, completion: nil)

答案 2 :(得分:0)

sar -n DEV 1 60 | grep lo > sar.log & 的最小范围为unsigned long 0 to 4294967295

4 bytes分配给不够大的0x0200000001 (8589934593)会触发转化,使其适合您机器上的unsigned long。此转换是实现定义的,但通常会丢弃较高的位。

unsigned long将告诉您类型使用的字节数。它不会告诉你你的值占用了多少字节。

答案 3 :(得分:0)

sizeof(part1)(我假设你有拼写错误)给出unsigned long的大小(即sizeof(unsigned long))。因此part1的大小无论存储在哪个值都是相同的。

在您的编译器上,sizeof(unsigned long)的值为8。类型的大小是为所有类型(定义为char的{​​{1}}类型除外)定义的实现,因此编译器之间可能会有所不同。

您期望的1值是通过将9的值写入文件或字符串作为人类可读的十六进制而没有前导零或前缀来获得的输出大小。这与part1运营商没有任何关系。并且,在输出值时,可以以不同的方式对其进行格式化(例如,十六进制与十进制对十进制,八进制,前导零或不一致),这会影响输出的大小

答案 4 :(得分:-1)

sizeof(part1)返回变量part1的数据类型的大小,您已将其定义为unsigned long

编译器的unsigned long的位大小总是64位,或8字节长,即8位8位组。十六进制表示是二进制格式的人类可读形式,其中每个数字是4位长。 为了清晰起见,我们人类经常省略前导零,计算机从不这样做。

让我们考虑一个字节的数据 - char - 并且值为零。

 - decimal:         0
 - hexadecimal :   0x0   (often written as 0x00)
 - binary:         0000 0000   

有关C ++数据类型及其相应位大小的列表,请查看文档(msvc文档更易于阅读):

对于msvc:https://msdn.microsoft.com/en-us/library/s3f49ktz(v=vs.71).aspx

for gcc:https://www.gnu.org/software/gnu-c-manual/gnu-c-manual.html#Data-Types

所有编译器都有其数据大小的文档,因为它们依赖于硬件编译器本身。如果你使用不同的编译器,谷歌搜索&#34;&#39;你的编译器名称&#39;数据大小&#34;将帮助您找到适合您的编译器的正确尺寸。