簡體   English   中英

如果為char分配的值太大而無法放入字節,會發生什么?

[英]What happens when a char is assigned a value too large to fit in a byte?

假設我有一個char指針:

    char * cp;
    int val2 = 2;
    cp = &val2;
    *cp = 1234;

由於值1234太大而無法容納1個字節會發生什么? 它會溢出並導致存儲不正確的值,還是會以某種方式將正確的值存儲在幾個字節中?

*cp = 1234; *cp僅指一個字節,即val2的第一個(最低尋址)字節。

在賦值中,右側的值將轉換為左側的類型。 因此,1234將轉換為char

這里有兩個復雜的問題。 一,在大多數C實現中,1234太大而不適合char (C標准允許char大於8位,但這在現代計算機中很少見。)2, char可以是有符號或無符號的。

如果char是無符號的,那么轉換很明確:1234比char的最大值模數減少一個(通常為255,因此減少模數為256)。 在通常情況下,1234將減少到210,並且這將存儲在*cp引用的字節中。

如果char已簽名且1234不適合char ,則轉換是實現定義的,或者引發實現定義的信號。 在許多現代C實現中,轉換的結果將是-46。

cp指向cp = &val2;之后的字節cp = &val2; val2的最低地址字節。 它不一定是val2的最低有效字節。 一些C實現存儲內存中最低有效字節最小的整數( 小端 ),而一些C實現存儲內存中最高有效字節最低的整數( 大端 )。 (甚至有些系統不按順序存儲字節;它們可能在內存中混淆。)

大多數現代C實現以二進制形式存儲整數而沒有填充,因此,一旦你知道C實現是big-endian還是little-endian,你就會知道改變一個字節會如何影響int的值。 但是,C標准仍然允許符號或數字補碼。 它還允許有符號整數中的填充位。

最后,請注意char是一種特殊類型,它允許以這種方式訪問​​其他對象的一部分。 例如,如果你使用short而不是char ,就像short *sp = &val2; *sp = 0; short *sp = &val2; *sp = 0; ,這將違反別名規則,並且行為將是未定義的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM